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

Avi*_*nda 0 linux process docker 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或supervisor)来解决这些问题会更好吗?如果是这样,请建议一个轻量级的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/...
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏.

Dan*_*owe 7

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

有关更多信息,您可以阅读Docker和PID 1 Zombie Reaping Problem.

当PID 1退出时,容器将退出,因此孩子不一定会优雅地退出.如果你希望他们优雅地退出,你将不得不有一些知道如何做到这一点.

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

  • @AvinashReddyPenugonda这不是问题,它是Linux系统的功能和预期行为.容器只是向上移动一层抽象.如果你需要在容器继续运行时收获僵尸,那么有一个init进程被添加到最近的版本中,或者你可以像tini一样添加你自己的init.否则,请确保您的pid 1知道如何优雅地停止您的容器. (3认同)