linux - 当我们向 pid 1 发送停止时,docker 如何处理子进程

标签 linux docker process docker-compose

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

在这些我们有子进程的情况下,是否有一个简单的进程主管和初始化系统(https://github.com/Yelp/dumb-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/...

感谢任何帮助。

最佳答案

Docker 不会在这里做任何事情。它只是向 PID 1 发送信号。如果 PID 1 有 child ,则需要处理向他们发送信号。这是标准的 unix 模型。

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

当PID 1退出时,容器也会退出,所以子进程不一定会优雅退出。如果您希望他们优雅地退出,您将必须有一些知道如何做到这一点的东西。

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

关于linux - 当我们向 pid 1 发送停止时,docker 如何处理子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43551607/

相关文章:

docker - minikube docker-env 是什么意思?

python - 为什么pystan安装这么慢?

linux - 了解不同的 Docker 组件

php - 在 PHP 中设置 CPU 亲和性?

tcp - 进程和 TCPSocket 在 Crystal 中没有正确关闭

c - 从父进程获取子进程的退出状态并将其打印在父进程中。

php - Composer 更新显示 mmap() 失败 : [12] Cannot allocate memory

linux - 清理 linux 控制台的任何输出

linux - 在 Unix/Linux 中判断两个文件是否具有相同内容的最快方法?

linux - 将证书从 Nginx 服务器传递到另一个 Nginx 服务器以进行客户端身份验证