我目前在 Dockerfile 中使用 ENTRYPOINT ["/sbs/start.sh"]。因此,当容器启动时,start.sh 作为 pid 1 运行,而我的 start.sh 脚本将另外两个子进程跨越到 pid1。我的问题是当我向 pid1 发送 docker stop 命令时,docker 将如何处理子进程?子进程会被优雅地停止吗?还是会被强行杀死?
在这些我们有子进程的情况下,是否最好有一个简单的进程主管和初始化系统(https://github.com/Yelp/dumb-init或 supervisor)来解决这些问题?如果是这样,请建议一个轻量级的初始化系统?或者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 有子进程,它应该处理向它们发出信号。这是标准的 Unix 模型。
有关更多信息,您可以阅读Docker 和 PID 1 Zombie Reaping Problem。
当 PID 1 退出时,容器将退出,因此孩子们不一定会优雅地退出。如果你想让他们优雅地退出,你就必须有一些知道如何做到这一点的东西。
上面的链接提供了一个解决方案,一个来自 Phusion 的图像,它有一个 init-style PID 1 来处理这样的事情。还有其他解决方案;这只是一种选择。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句