考虑以下,这在后台运行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!!!
这将启动一个泊坞的容器中,作为bash
PID1。然后它叉/执行一个sleep
进程,然后bash
退出。当Docker容器死亡时,sleep
进程也死机。
我的问题是:什么是sleep
进程被杀死的机制?我试图在子进程中捕获SIGTERM
,并且看起来没有被绊倒。我的推测是,关闭容器正在使用的cgroup时,Docker或Linux内核正在发送SIGKILL
,但我在任何地方都没有找到说明这一点的文档。
编辑我来解释最接近的是从baseimage-docker以下报价:
如果你的init进程是你的应用程序,那么它很可能只是关闭本身,而不是所有的容器中的其他进程。内核然后会强行终止其他进程,而不是让他们有机会正常关闭,可能导致文件损坏,临时文件过时等。您真的想要优雅地关闭所有进程。
因此,至少根据这一点,暗示当容器退出时,内核将发送一个SIGKILL到所有剩余的进程。但是我还是希望清楚它是如何决定这么做的(即它是cgroups的一个特征吗?),理想情况下更权威的来源会更好。
这是可能的码头工人'runc'做清理,如果你[在主机PID命名空间运行(https://github.com/opencontainers/runc/blob/c4e0d94efacd6f6fb353a538cc01d10792cc3a35 /libcontainer/state_linux.go#L41-L45)。 – Matt
,内核确实发送了一个'SIGKILL'来终止进程。 – Matt
@Matt很高兴知道。它是否成为主机'init'进程收获这些进程的责任,还是内核将它们从进程表本身中删除? –