docker

时间:2017-09-05 12:06:57

标签: node.js linux google-chrome docker

我有一个docker容器,它运行node.js应用程序。此应用程序运行无头镀铬实例。

一切正常,但如果我杀死chrome-instance,并检查运行的进程列表,我将在系统中看到2(实际上是3 + 2 cat进程)zombie chrome进程( defunct )。我知道这个过程是一个孩子 (被杀死的 chrome进程),未完成正确并附加到 init 进程。

我试图直接杀死它 - 被拒绝了。此外,我尝试使用detached:true标志生成chrome并再次直接终止所有子进程,当主chrome收到“exit”信号时,无论如何ps -A | grep chrome向我显示两个 defunct 。有什么想法吗?

UPD: 谢谢大家的帮助。添加--init完全解决了我的问题。使用另一个基本图像也很好,但我认为这种方法不是必要的。也可以找到根本原因的良好描述here

2 个答案:

答案 0 :(得分:2)

您需要一个可以调用wait()的流程,以便获得任何zombie processes。在常规系统上,这由/sbin/init处理,但在容器内,您需要提供自己的工具。如果您正在开发自己的应用程序,请考虑定期在循环中调用wait()

或者,您可以考虑特定于容器的init,例如dumb-init,看看是否能解决问题。

答案 1 :(得分:-1)

larsks几乎指出了原因,Linux系统上的init(或systemd)在其父级死亡时收获了僵尸进程。父级应该使用wait系统调用来清理自己的僵尸进程。但是,自动清理不会传递容器的命名空间边界。因此,无论您作为入口点运行的进程是什么进程,都需要为您处理这些僵尸。

使用最新版本的docker,只需将--init传递给docker run命令即可​​包含init进程。如果您使用的是版本2.2撰写文件,则可以选择init: true选项,您可以在服务上定义相同的结果。

除了dumb-init之外,还有tini这就是docker在封面下使用它们作为自己的docker-init。