GNU/Linux >> Linux の 問題 >  >> Linux

Docker がターミナルで CTRL+C に応答しない

使用しているコンテナー イメージがプロセス シグナルを適切に処理していない可能性があります。イメージを作成している場合は、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 などの最小限の初期化プロセスを実行することです。


Linux
  1. 「kill-9」が機能しない場合はどうなりますか?

  2. Linux – -9プロセスを強制終了すべきではないのはいつですか?

  3. ターミナル:Termcapinfoコマンドが見つかりませんか?

  1. gnome-terminal:コマンドが見つかりません

  2. Tomcat は実行中ですが、8080 ポートが応答しません

  3. Docker ボリュームがファイルをマウントしていない

  1. Docker がディレクトリの変更を更新しない

  2. ターミナルで su の root パスワードが機能しない

  3. デタッチされたプロセスに端末を接続するにはどうすればよいですか?