{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/knowhow-of-circleci-1/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"c2350dab-9fb4-5cd3-9170-6ba25c598c62","excerpt":"こんにちは。 かれこれ 1 年くらい仕事で CircleCI + Docker を使ってみているのですが、 とにかくツラい 。 CircleCI + Docker 構成で CI したい方はだいぶマゾいとすら思います。 他の CI…","html":"<p>こんにちは。<br>\nかれこれ 1 年くらい仕事で CircleCI + Docker を使ってみているのですが、 <strong>とにかくツラい</strong> 。<br>\nCircleCI + Docker 構成で CI したい方はだいぶマゾいとすら思います。<br>\n他の CI 系のサービスどうなんだろうと調べつつも、これまで戦ってきたノウハウは備忘録として残そうと思います。</p>\n<p>なにがツラいかというと、</p>\n<ul>\n<li><a href=\"https://ja.wikipedia.org/wiki/Btrfs\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">btrfs（B 木ファイルシステム）</a>というファイルシステム上に</li>\n<li><a href=\"https://github.com/circleci/docker\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">独自に fork した Docker</a>を積んでおり</li>\n<li>のと、CI で使用するイメージに色々カスタマイズが入っている（調べきれていない）</li>\n</ul>\n<p>という構成だと、色々な Docker に関する操作が動きません。<br>\nローカルでは動くので、基本ドはまりする要素満載です。<br>\nさらに docker-compose でブラックボックスに包むと、余計にわけがわからなくなります。</p>\n<p>ということでハマったことと、CircleCI で Docker を扱うための基本戦術を残します。</p>\n<!--more-->\n<h2 id=\"tips-ビルドに-docker1100-docker-compose-180-を使用する\" style=\"position:relative;\"><a href=\"#tips-%E3%83%93%E3%83%AB%E3%83%89%E3%81%AB-docker1100-docker-compose-180-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B\" aria-label=\"tips ビルドに docker1100 docker compose 180 を使用する permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Tips: ビルドに Docker1.10.0, docker-compose 1.8.0 を使用する</h2>\n<p>新しければエラーが少ないかというと、よく分かりません。。。<br>\n相性がそもそも合ってないので、どのバージョンでも割り切ったほうが良いです。</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">machine</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">pre</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> curl <span class=\"token punctuation\">-</span>sSL https<span class=\"token punctuation\">:</span>//s3.amazonaws.com/circle<span class=\"token punctuation\">-</span>downloads/install<span class=\"token punctuation\">-</span>circleci<span class=\"token punctuation\">-</span>docker.sh <span class=\"token punctuation\">|</span> bash <span class=\"token punctuation\">-</span>s <span class=\"token punctuation\">-</span><span class=\"token punctuation\">-</span> 1.10.0\n    <span class=\"token punctuation\">-</span> sudo pip install docker<span class=\"token punctuation\">-</span>compose==1.8.0</code></pre></div>\n<p>を足してあげて下さい</p>\n<h2 id=\"基本的な方針\" style=\"position:relative;\"><a href=\"#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E6%96%B9%E9%87%9D\" aria-label=\"基本的な方針 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>基本的な方針</h2>\n<ul>\n<li>コンテナの削除に関連するコマンドを実行しない（しても成功しない）</li>\n<li>docker exec しない</li>\n</ul>\n<p>これに付きます。<br>\n意外と上記の制約がキツく、リソースが枯れたり思うようにできなかったりします。</p>\n<h2 id=\"docker-の制限\" style=\"position:relative;\"><a href=\"#docker-%E3%81%AE%E5%88%B6%E9%99%90\" aria-label=\"docker の制限 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Docker の制限</h2>\n<h3 id=\"run-rm-オプションは使わない\" style=\"position:relative;\"><a href=\"#run-rm-%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AF%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84\" aria-label=\"run rm オプションは使わない permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>run –rm オプションは使わない</h3>\n<p>run したコンテナを rm する時にエラーになります。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Error removing intermediate container XXXXXXXXX:\nDriver btrfs failed to remove root filesystem XXXXXXXXXXXX Failed to destroy btrfs snapshot: operation not permitted</code></pre></div>\n<p>のようなエラーです。<br>\n色々試してみたものの、結局のところ <strong>–rm オプションはつけない</strong> ことで回避できます。<br>\n要らないコンテナを消せないのはなんとも気持ち悪いですが、動かないんじゃ仕方ない</p>\n<h3 id=\"rm-コマンドは使わない\" style=\"position:relative;\"><a href=\"#rm-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AF%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84\" aria-label=\"rm コマンドは使わない permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>rm コマンドは使わない</h3>\n<p><code>docker rm</code>も同様です。使ってはいけません。</p>\n<h3 id=\"exec-コマンドは使わない\" style=\"position:relative;\"><a href=\"#exec-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AF%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84\" aria-label=\"exec コマンドは使わない permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>exec コマンドは使わない</h3>\n<p>デフォルトの Docker でも、1.10.0 でもどちらもエラーになります。</p>\n<p>1.10.0 の場合、私の環境では</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">open /proc/self/oom_score_adj: no such file or directory</code></pre></div>\n<blockquote>\n<p>— <a href=\"https://discuss.circleci.com/t/exit-code-255-on-all-docker-exec-commands/2506\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Exit Code 255 on all Docker exec commands – Build Environment – CircleCI Community Discussion</a><br>\n— <a href=\"https://discuss.circleci.com/t/docker-1-10-0-is-available-beta/2100/15\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Docker 1.10.0 is available (Beta) – Build Environment – CircleCI Community Discussion</a></p>\n</blockquote>\n<p>というエラーが発生しました。</p>\n<p><a href=\"http://qiita.com/sawanoboly/items/c6df7cce870f44ed4aaf\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">1.10.0 からは LXC(Linux コンテナ) Driver のサポートが切られている模様 ※記事下部コメント参照</a>です。<br>\n色々試してみましたが、結局 exec は使わない方向に倒さないとどうにもなりませんでした。</p>\n<h3 id=\"circleci-上で-docker-build-しない\" style=\"position:relative;\"><a href=\"#circleci-%E4%B8%8A%E3%81%A7-docker-build-%E3%81%97%E3%81%AA%E3%81%84\" aria-label=\"circleci 上で docker build しない permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>CircleCI 上で docker build しない</h3>\n<p>流石に<code>docker build</code>はできるかというと、できないこともあります。<br>\nまだ再現性は不明で、突如訪れます。</p>\n<blockquote>\n<p>— <a href=\"https://discuss.circleci.com/t/docker-error-removing-intermediate-container/70\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Docker Error removing intermediate container – Build Environment – CircleCI Community Discussion</a></p>\n</blockquote>\n<p>リポジトリで Dockerfile を管理しており、ビルドがきちんと動くかどうか CI したい、なんてケースでドハマリすることがあります。<br>\nその場合はもう諦めて Docker hub などの Docker レジストリに上げておいて、そのイメージを pull して使用する形で回避できます。<br>\n（もうこの時点でだいぶ無理が来ていると思う）</p>\n<h3 id=\"circle_artifacts-をコンテナにマウントしない\" style=\"position:relative;\"><a href=\"#circle_artifacts-%E3%82%92%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AB%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%81%97%E3%81%AA%E3%81%84\" aria-label=\"circle_artifacts をコンテナにマウントしない permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>CIRCLE_ARTIFACTS をコンテナにマウントしない</h3>\n<p>色々な厄災を招きます。<br>\n例えばカバレッジレポートなどの副作用が欲しい場合、docker コマンド上では適当なローカルのフォルダにマウントしておき、<br>\ncircle.yml 上で生成されたファイルを<code>$CIRCLE_ARTIFACTS</code>へ mv したり cp したりした方が安定します。</p>\n<p>ここも詳しくは調査が足りていません。</p>\n<h2 id=\"docker-compose-の制限\" style=\"position:relative;\"><a href=\"#docker-compose-%E3%81%AE%E5%88%B6%E9%99%90\" aria-label=\"docker compose の制限 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>docker-compose の制限</h2>\n<p>Docker のラッパーである docker-compose も当然同様の制約がつきまといます。</p>\n<ul>\n<li>rm コマンドは使わない</li>\n<li>exec コマンドは使わない</li>\n</ul>\n<p>など基本的なことに加え、以下にハマりました。</p>\n<h3 id=\"up-force-recreate-は使わない\" style=\"position:relative;\"><a href=\"#up-force-recreate-%E3%81%AF%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84\" aria-label=\"up force recreate は使わない permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>up –force-recreate は使わない</h3>\n<p>ビルドの過程でイメージから新鮮なコンテナを再生成したい、というケースでハマりました。<br>\n明示的に rm しなければ大丈夫なのでは？ と思いましたが、ダメでした。</p>\n<p><code>--force-recreate</code>が内部的に rm するので、当然エラーになります。<br>\ndocker-compose の場合、一度立ち上げたコンテナを削除すること無く新鮮な状態にロールバックする回避策が必要です。<br>\nこればかりはプロジェクトによると思うので割愛します。<br>\n<strong>なお、このとき動いているコンテナに対して exec はできません</strong></p>\n<h2 id=\"さいごに\" style=\"position:relative;\"><a href=\"#%E3%81%95%E3%81%84%E3%81%94%E3%81%AB\" aria-label=\"さいごに permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>さいごに</h2>\n<p>rm はダメ、と言いましたができることもあります。<br>\nコンテナにマウントするフォルダによって変わったりするので、条件が分かり次第明記します。</p>\n<p>色々と調査不足が目立つ内容なので、必ずしもこの記事を読んだ方の環境でも同様の減少になるかどうかは分かりません。<br>\nもしご指摘や補足があればして頂けると幸いです。</p>","timeToRead":6,"frontmatter":{"title":"CircleCI 1.0でDockerやdocker-composeを使用する際の制限と気をつけること","tags":["CI","CircleCI","Docker","Docker compose"],"date":"May 15, 2017","featuredImage":null}}},"pageContext":{"slug":"/knowhow-of-circleci-1/","previous":{"fields":{"slug":"/how-to-parse-of-coverage-report-with-phpunit/"},"frontmatter":{"title":"PHPUnitのカバレッジレポート(XML)を使ってカバレッジの計算してみた","tags":["PHP","PHPUnit"]}},"next":{"fields":{"slug":"/how-to-implement-dirty-check-and-method-missing-with-nodejs/"},"frontmatter":{"title":"Node.jsのProxyでdirty checkとmethod missingを実現してみる","tags":["JavaScript","Nodejs","Proxy","Ruby"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}