考虑以下,它sleep 60
在后台运行然后退出:
$ 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 的 Docker 容器。然后它 fork/execs 一个sleep
进程,然后bash
退出。当 Docker 容器死亡时,sleep
进程也会以某种方式死亡。
我的问题是:sleep
进程被杀死的机制是什么?我尝试SIGTERM
在子进程中进行捕获,但这似乎没有被绊倒。SIGKILL
我的假设是,在关闭容器正在使用的 cgroup 时,某些东西(Docker 或 Linux 内核)正在发送,但我在任何地方都找不到任何文档来澄清这一点。
编辑我最接近的解释是来自baseimage-docker的以下引用:
如果您的 init 进程是您的应用程序,那么它可能只会关闭自己,而不是容器中的所有其他进程。然后内核将强行杀死那些其他进程,而不给它们正常关闭的机会,这可能会导致文件损坏、过时的临时文件等。你真的想优雅地关闭所有进程。
所以至少按照这个,意思是当容器退出时,内核会向所有剩余的进程发送一个SIGKILL。但是我仍然希望清楚它是如何决定这样做的(即,它是 cgroups 的一个特性吗?),理想情况下,一个更权威的来源会很好。