Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
36
Help us understand the problem. What are the problem?
@KEINOS

docker-compose で一向にビルドがはじまらない、もしくは起動しない。はたまた忘れたころに起動する。

docker-compose updocker-compose build しても building <サービス名> と出たまま先に進まない。ハングしているような感じで固まる。

TL; DR (今北産業)

  1. 大量のファイルを裏で Docker daemon が読み込んでいる可能性があります。
  2. docker-compose を使わずに docker build -t test:local . と Docker でビルドしてみて永遠と転送していたらビンゴです。
  3. .dockerignore で、大量ファイルのあるディレクトリを除外しておき、docker-compose.json 内で別途マウントしましょう。

TS; DR (わかれば簡単なことに気づくまでの細かいこと)

さっきまで docker-compose run --rm <name_service> で動いていた、機械学習の写経用コンテナが起動しなくなりました。「おかしいな」と、docker-compose build --no-cache とビルドしなおしても同じです。

起動しないと言うより止まったままの状態が続いたのです。

buildの場合
$ docker-compose build --no-cache
Building sample_service1 ← ここでハングってる

そこで、Ctrl+c で処理を止め、写経と言えば坊主ということで --verbose を呼んでみました。:bellhop: チリン

build時の詳細
$ docker-compose build --no-cache
Building sample_service1 ← ここでハングってる
^CERROR: Aborting.

$ docker-compose --verbose build --no-cache
compose.config.config.find: Using configuration files: ./docker-compose.yml
...省略...
compose.service.build: Building sample_service1
compose.cli.verbose_proxy.proxy_callable: docker build <- (path='~/Desktop/Sample', tag='samp
le:local', rm=True, forcerm=False, pull=False, nocache=True, dockerfile=None, cache_from=None
, labels=None, buildargs={}, network_mode=None, target=None, shmsize=None, extra_hosts=None,
 container_limits={'memory': None}, gzip=False, isolation=None, platform=None) ← ここで止まる

どうも、上記 compose.cli.verbose_proxy.proxy_callable:docker-composedocker build を呼び出した処理で止まったままです。

Docker がイメージを pull する際、たまにネットワークが重かったり pull 先が重い場合に反応が遅れることはあるのですが、体感的にいつも以上の時間がかかっています。

切り分け(やったこと):

  • docker-compose build --no-cacheNG(現象同じ)
  • docker-compose down からの docker-compose upNG(現象同じ)
  • docker-compose stop からの docker-compose upNG(現象同じ)
  • docker-compose psNG(起動中コンテナなし)
  • docker container prune -f docker image prune -f からの docker-compose build --no-cacheNG(現象同じ)
  • docker-compose logsNGAttaching to が出るだけ)
  • ホスト OS の再起動 → NG(現象同じ)
  • docker run --rm hello-world:latestOK(起動する)
  • docker-compose の "Hello World!"OK(起動する)

以上の切り分けにより、dockerdocker-compose 自体は生きているものの「現在の Dockerfiledocker-compose.yml に問題がありそう」と判断できそうです。

しかし、それらファイルはいじっていません。となると、別途マウントさせてるスクリプトやイメージなどに原因がありそうです。

そこで、docker-compose を通さず Docker から直接イメージを1つ1つビルドしてみました。

$ docker build -t test:local .
Sending build context to Docker daemon xxxMB

すると、なんとなんと!上記の xxxMB が永遠とカウントアップされていきます。何やら大量のファイルがコンテキストに送られているではありませんか!

「そうかっ!!学習用のデータ、かっ!!」

🐒  コンテキストとは context は日本語で「文脈」「文の前後関係」「事情」「背景」「状況」などといった意味があります。 con-text で構成され、con- の接頭辞は「一緒に」とか「付いに」などの意味を持ち、text は 「組み上げる」「編む」「作る」「構成する」の *teks- から来ています。つまり contextは、何かを「実行」「判断」「作成」する際に添えられた裏付け情報のような意味合いになります。 そのため、Sending build context to ... とは「(Docker イメージの)ビルドに必要な情報を ... に送信中」という意味になります。

実は、機械学習用に用意した大量のデータ・ボリューム(data ディレクトリ)をコンテナにマウントさせていたのですが、軽量のデータで動作確認したいと思いディレクトリ名をリネームしたのを失念していました

つまり、data ディレクトリ内のデータ量が多いため .dockerignore で除外して、ビルド後にマウントさていたのですが、datadata2 にリネームされたことにより、ビルド時にデータ(コンテキスト)としてメモリに読み込まれていたのです。

.dockerignore に記載済みだった data 同様、問題の data2 を追加していつもどおり動くようになりましたとさ。とほほ

.dockerignore
data
data2

dockerdocker-compose の違い

docker はコンテナを個別に操作するコマンドで、docker-compose は同一マシン上で複数のコンテナを操作するオーケストレーション・ツールです。

docker は、コンテナを作成&起動すると各々個別の仮想ネットワークにコンテナを設置します。

つまり「docker ネットワーク」と呼ばれる仮想 LAN 内にサーバ(コンテナ)が 1 台だけ存在するネットワークを各々に作るということです。

そのため、そのままではコンテナ間の通信はネットワークが異なるため、できません。

複数コンテナを同じネットワークに設置したい場合は、docker network create <ネットワーク名> でネットワークを作成してから、コンテナを起動時に --network <ネットワーク名> オプションを付けて参加させる必要があります。

反面、docker-compose を使うと docker-compose.yaml に記載されたコンテナはデフォルトで同じネットワークに設置されます。

そのため、複数コンテナを起動してお互いを連携させたい場合は docker-compose の利用が便利です。詳しくは以下の記事を参照ください。

参考文献

関連文献

あわせて読みたい

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
36
Help us understand the problem. What are the problem?