動かざることバグの如し

近づきたいよ 君の理想に

docker composeでコンテナが終了したら全コンテナ終了させる方法

環境

  • Docker 25
  • Docker-compose v2

やりたいこと

Docker-compose環境でAコンテナとBコンテナがあったとする。Aコンテナが何らかの理由で落ちてしまった(終了した)場合に Bコンテナも強制終了させたい。

コード

services:
  app:
    image: thr3a/stress:latest
    command: stress --vm 1 --vm-hang 0 --vm-bytes 4024M
    init: true
    deploy:
      resources:
        limits:
          memory: 50M

  nginx:
    image: nginx
    depends_on:
      app:
        condition: service_completed_successfully

起動するときは必ず --abort-on-container-exit をつけなければならない。そのため -d は併用できない

docker compose up --abort-on-container-exit

解説

解説

この設定では、appnginxという2つのサービスが定義されている。appサービスは、メモリ制限が50Mのthr3a/stress:latestイメージを使用し、特定のコマンドを実行する。一方、nginxサービスは、nginxイメージを使用し、appサービスに依存している。

depends_onの設定により、appサービスが正常に完了するまでnginxサービスは開始されない。しかし、この設定だけでは、appサービスが何らかの理由で終了した場合、nginxサービスは自動的には終了しない。

そこで、docker compose up --abort-on-container-exitコマンドを使用する。このコマンドは、任意のサービスが終了した場合に、他のすべてのサービスを終了させる。つまり、appサービスが終了すると、nginxサービスも自動的に終了する。

ただし、このコマンドはデタッチモード(-dオプション)と併用できないため注意が必要だ。デタッチモードを使用すると、コンテナはバックグラウンドで実行され、ユーザーは他のコマンドを入力できる。しかし、--abort-on-container-exitオプションを使用すると、コンテナが終了するまでシェルはブロックされ、ユーザーは他のコマンドを入力できない。これは、--abort-on-container-exitオプションがコンテナの終了を監視し、必要に応じて他のコンテナを終了させるためだ。このため、-dオプションと併用すると、この監視機能が失われ、期待した動作が得られない可能性がある。