使用しているコンテナー イメージがプロセス シグナルを適切に処理していない可能性があります。イメージを作成している場合は、Roland Webers の回答が示すように変更してください。 .
docker run -it --init ....
これで Ctrl+C が修正されました。出典:https://docs.docker.com/v17.09/engine/reference/run/#specify-an-init-process
この投稿では、プロセスをバックグラウンドに送信し、プロセス ID によってプロセスを強制終了するための回避策として CTRL-Z を提案しています:Ctrl-C で Python スクリプトを強制終了できません
考えられる問題:
-
プログラムは ctrl-c をキャッチして何もしませんが、ほとんどありません。
-
正しく管理されていないバックグラウンド プロセスがあります。メイン プロセスのみがシグナルを受信し、サブプロセスがハングします。起こっている可能性が非常に高いです。
提案された解決策:
-
適切に開始および停止する方法については、プログラムのドキュメントを確認してください。 ctrl-c は適切な方法ではないようです。
-
コンテナー プロセスをブロックし、ctrl-c をキャッチできる docker-entrypoint.sh bash スクリプトでプログラムをラップします。次の bash の例が役に立ちます:https://rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash
-
ctrl-c をキャッチした後、ipython ノートブックの適切なシャットダウン メソッドを呼び出します。
問題は、Ctrl-C がコンテナー内の最上位プロセスにシグナルを送信することですが、そのプロセスは必ずしも期待どおりに反応するとは限りません。トップレベルのプロセスは、コンテナ内で ID 1 を持っています。つまり、プロセスが通常持っているデフォルトのシグナル ハンドラを取得しません。最上位プロセスがシェルの場合、そのプロセスは独自のハンドラーを介してシグナルを受信できますが、シェル内で実行されるコマンドには転送しません。詳細はこちらで説明しています。どちらの場合も、Docker コンテナーは Ctrl-C を単に無視するかのように動作します。
独自のイメージを構築している場合、解決策は、コンテナー内の最上位プロセスとして、tini や Dam-init などの最小限の初期化プロセスを実行することです。