環境
- 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
解説
解説
この設定では、app
とnginx
という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
オプションと併用すると、この監視機能が失われ、期待した動作が得られない可能性がある。