はバックグラウンドでsleep 60
を実行して終了以下、考えてみましょう:DockerコンテナのPID1が終了すると、他のプロセスはどうなりますか?
$ cat run.sh
sleep 60&
ps
echo Goodbye!!!
$ docker run --rm -v $(pwd)/run.sh:/run.sh ubuntu:16.04 bash /run.sh
PID TTY TIME CMD
1 ? 00:00:00 bash
5 ? 00:00:00 sleep
6 ? 00:00:00 ps
Goodbye!!!
をこれがPID1としてbash
と、ドッカーコンテナを開始します。その後、sleep
プロセスをfork/execした後、bash
を終了します。 Dockerコンテナが死ぬと、sleep
プロセスが何とか死んでしまいます。
私の質問は:sleep
プロセスが殺される仕組みは何ですか?私は子プロセスでSIGTERM
を捕まえようとしましたが、それはつまらないようです。私の前提は、コンテナが使用しているcgroupをシャットダウンするときに何か(DockerまたはLinuxカーネルのいずれか)がSIGKILL
を送信していることです。しかし、これを明確にする文書はどこにも見つかりませんでした。あなたのinitプロセスは、あなたのアプリケーションであれば、それはおそらく唯一の、それ自身ではなく、すべてのシャットダウンします、
:
EDIT私が説明に来て最も近い次baseimage-dockerからの引用です容器内の他のプロセス。カーネルは強制的に他のプロセスを強制終了し、正常にシャットダウンする機会を与えず、ファイルの破損や古い一時ファイルなどを潜在的に破棄します。本当にすべてのプロセスを正常にシャットダウンする必要があります。
したがって、少なくともコンテナが終了すると、カーネルは残りのすべてのプロセスにSIGKILLを送信することを意味します。しかし、私はそれをどうするかを明確にしたい(つまり、cgroupsの機能ですか?)、理想的にはもっと権威のあるソースがいいと思います。
https://github.com/opencontainers/runc/blob/c4e0d94efacd6f6fb353a538cc01d10792cc3a35(あなたが[ホストのPID名前空間で実行されている]されている場合ドッカーズ 'runc'はクリーンアップを行うことが可能です/libcontainer/state_linux.go#L41-L45)。 – Matt
カーネルはプロセスを終了させるために 'SIGKILL'を送ります。 – Matt
@Mattお役立ち情報これらのプロセスをホストする 'init'プロセスの責任となるのでしょうか、それともカーネルがプロセステーブル自体からそれらを削除するのでしょうか? –