2016-09-26 10 views
2

私はドッカ-コンを使用してスピンアップされている2個のコンテナがあります。この例ではドッカーを使って従属コンテナを閉じる方法は?

web: 
    image: personal/webserver 
    depends_on: 
    - database 
    entrypoint: /usr/bin/runmytests.sh 
database: 
    image: personal/database 

を、runmytests.shがゼロまたはゼロ以外の終了のいずれかで返し、その後、数秒間実行されるスクリプトですコード。

docker-composeでこの設定を実行すると、web_1がスクリプトを実行して終了します。 database_1は、データベースを実行しているプロセスがまだ実行中であるため、開いたままです。

web_1のタスクが完了したら、database_1で正常な終了をトリガーしたいと思います。

答えて

5

--abort-on-container-exitフラグをdocker-compose upに渡して、終了時に他のコンテナを停止させることができます。

+0

いつもCLIオプションがあります。私はこれらのコマンドを忘れています。多くの可能性があります。偉大な答え、これは受け入れられる答えに値する。 – BMitch

2

私はドッカーがこのユースケースをサポートしているとは思いません。しかし、単純なシェルスクリプトを作成すると、簡単にこれを解決できます。

#!/bin/sh 

docker run -d --name=database personal/database 
docker run --rm -it --entrypoint=/usr/bin/runmytests.sh personal/webserver 
docker stop database 
docker rm database 
2

あなたが記述していることは、KubernetesのPodまたはAWSのタスクと呼ばれています。ユニットを構成するコンテナのグループです。 Dockerは現在その概念を持っていません(Swarmモードには「タスク」が近づいていますが、この時点でタスクごとに1つのコンテナしかサポートしていません)。

@BMitchが記述されているように、スクリプトの横にハックのある回避策があります。 Dockerデーモンソケットをホストからマウントできます。例:

web: 
    image: personal/webserver 
    depends_on: 
    - database 
    volumes: 
    - /var/run/docker.sock:/var/run/docker.sock 
    entrypoint: /usr/bin/runmytests.sh 

personal/webserverイメージにDockerクライアントを追加してください。これにより、runmytests.shスクリプトがDocker CLIを使用してデータベースを最初にシャットダウンすることができます。例:docker kill database

編集: 3番目のオプション。 すべてのコンテナが失敗した場合は、--abort-on-container-exitオプションをdocker-composeに使用して、別の回答で@dnephinの言及を使用することができます。

+0

これはもっと複雑なものになるようです。 '--abort-on-container-exit'フラグを' docker-compose up'に渡して、他のコンテナを止めることができます。 – dnephin

+1

@dnephinあなたはこの場合正しいです(つまり、他のすべてのコンテナは停止されます)。私はいつも、人々がSOに投稿するドッカー作成ファイルを、複数のサービスが定義されている実際の作成ファイルの簡略化された縮小バージョンとして考えます。私はこの情報を私の答えに加えます。 – Alkaline

+0

ドッカーソケットの取り付けは、コンテナの最後の手段と考えてください。他のコンテナを管理するコンテナにのみ必要です。これをデータベースを実行するスクリプトに使用すると、過度の作業になります。このソケットがマウントされているコンテナは、そのコンテナ内で実行されているすべてのコマンドをホストマシンおよび実行中のコンテナにフルルートでアクセスできます。 – BMitch

関連する問題