我有一个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
答案 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。