2017-08-16 3 views
0

ノードサーバーを含むドッカーコンテナを実行しています。コンテナに接続し、実行中のサーバを強制終了し、再起動します(開発用)。しかし、私はノードサーバーを殺すと、コンテナ全体を殺します(おそらく、コンテナが始まったプロセスを殺しているためです)。コンテナ全体を強制終了せずにドッカーコンテナのデフォルトコマンドをどのように殺すのですか?

これは可能ですか? This answerが助けられましたが、(可能であれば)コンテナを強制終了せずにコンテナのデフォルトプロセスを強制終了する方法については説明していません。

私がしようとしていることができない場合、この問題を回避するにはどうすればよいですか?リンクされた解答のコメントに示唆されているように、私のドッカー作成の各画像にcommand: bash -c "while true; do echo 'Hit CTRL+C'; sleep 1; done"を追加すると理想的な解決策のようには見えません。

+0

nodejを停止すると失敗するヘルスチェックはありますか? – herm

答えて

3

これはDockerの仕様です。各コンテナは、サービスのステートレスなインスタンスであるはずです。そのサービスが中断された場合、コンテナは破棄されます。そのサービスが要求/開始されると、そのサービスが作成されます。 k8s、swarm、mesos、cattleなどのオーケストレーションプラットフォームを使用しているなら、少なくとも。

サービス自体ではなく、PID 1を表すアプリケーションがあります。しかし、これはマイクロサービスやコンテナの設計理念に反するものです。次に、PID 1として実行できるinitシステムの例を示します。https://github.com/Yelp/dumb-init

なぜノードサーバーを再起動しますか?設定ファイルなどの変更を適用するには?そうであれば、あなたは間違った方向の解決策を探しています。代わりに、コンテナが応答したときにサービスが設定ファイルを再度読み込むように、永続的なボリュームを定義する必要があります。

https://docs.docker.com/engine/admin/volumes/volumes/

2

あなたがコンテナを実行しているプロセスを再起動する必要がある場合は、単純に実行します:容器にExec'ing

docker restart $container_name_or_id 

は、通常の操作に必要なすべきではない、それを考慮してくださいデバッグツール。あなたのコンテナがクラッシュした場合、それは目に見えるですので

むしろ自動的に再起動するために実行されますスクリプトを変更するよりも、私は、ドッキングウィンドウエンジンにそれを移動したい:

docker run --restart=unless-stopped ... 

コンテナは、上記で実行された場合オプションで、コンテナにdocker stopを意図的に実行しない限り、ドッカーがあなたを再起動します。

コンテナ内のpid 1を強制終了すると、それをシャットダウンする理由は、Linuxサーバ上のpid 1を強制終了することと同じです。 init/systemdを終了すると、ボックスはダウンします。コンテナの名前空間内には、同様の規則が適用され、変更することはできません。

関連する問題