当我们向pid 1发送停止时,docker如何对待子进程

时间:2017-04-21 20:35:43

标签: linux docker process docker-compose

我目前在Dockerfile中使用ENTRYPOINT [“/sbs/start.sh”]。因此,当容器启动时,start.sh作为pid 1运行,而我的start.sh脚本将另外两个子进程跨越到pid1。我的问题是当我向pid1发送docker stop命令时,docker如何处理子进程?孩子的过程会被优雅地停止吗?还是会被强行杀死?

在我们有子进程的情况下,有一个简单的进程管理器和init系统(https://github.com/Yelp/dumb-init或主管)来解决这些问题会更好吗?如果是这样,请建议一个轻量级的init系统?或者pid1(在我的情况下是start.sh)可以解决这些问题吗?

输出ps -ef:

root         1     0  0 19:23 ?        00:00:00 /bin/bash /sbs/start.sh

root        13     1  0 19:23 ?        00:00:00 /sbs/bin/envconsul... 

root        20    13  1 19:23 ?        00:00:21 /usr/lib/...

感谢任何帮助。

1 个答案:

答案 0 :(得分:7)

Docker在这里不会做任何事情。它只是表示PID 1.如果PID 1有子节点,则需要处理它们的信令。这是标准的unix模型。

有关更多信息,请阅读Docker and the PID 1 Zombie Reaping Problem

当PID 1退出时,容器将退出,因此孩子不一定会正常退出。如果你想让它们优雅地退出,你必须要知道如何做到这一点。

上面的链接提供了一个解决方案,一个来自Phusion的图像,它有一个init风格的PID 1来处理这样的事情。还有其他解决方案;这只是一种选择。