web-dev-qa-db-ja.com

Dockerで実行されているmongodb0.8を正常にシャットダウンする方法

DockerファイルのENTRYPOINT構成を介してmongodbを起動しています。それはうまくいきます。ただし、実行すると:

docker stop <containerid>

プロセスにSIGTERMを送信しているようです。つまり、mongod.lockファイルはクリアされません。実行中のDockerコンテナーを正常にシャットダウンして、Docker内で実行中のプロセスに適切なシグナルが送信されるようにするにはどうすればよいですか?

15
canadadry

よくわかりません。 docker stop <id>は確かにSIGTERMを送信します。これは仕様によるものです。プロセスがタイムアウト(デフォルトは10秒)内に適切にシャットダウンしなかった場合、SIGKILLが発行されます。

現時点では、信号の伝搬に問題があります。これは、pid名前空間とプロセスにpid 1があるためです。これは、新しい実行プラグインですぐに修正されるはずです。

12
creack

Docker 0.9以降を使用すると、デフォルトでSigTermが最初のプロセス(コンテナー内で実行されている)に送信されます。

ただし、環境変数ファイル(Ubuntuでは/ etc/default/docker、CentOSでは/ etc/sysconfig/docker)にDOCKER_OPTS = "-r = false"(またはother_args = "-r = false" CentOSでは)自動再起動コンテナからdockerを停止します。

たとえば、次の構成を使用しています。DOCKER_OPTS = "-g/mydir/docker -r = false --dns 8.8.4.4"

1つのコンテナ内でマルチプロセスを実行する場合は、最初のプロセスとしてsupervisordを使用する必要があります。supervisordは他のプロセスを管理し、それらにシグナルを転送します。

1
Tan Bui

Docker0.9を使用しています。 docker stopを呼び出すと、SIGTERMはコンテナ内でPID = 1のプロセスに送信されます。したがって、supervisord、runitを使用してサブプロセスを管理できます。

問題は、$ service docker stop | restartを呼び出すか、ホストマシンをリセットするときです。 Dockerは、実行中のすべてのコンテナーにSIGTERMを送信するわけではありません。私はこのケースを解決しようとしています。

1
Tan Bui