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