泊坞内的僵尸

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

一切工作正常,但如果我杀死铬实例,并检查运行的进程列表,我会看到2(实际上3 + 2猫进程)僵尸铬进程( 停止 )仍然在系统中。 我知道这个进程是一个subprocess(被杀死的进程),这个进程没有完成正确的,并附加到init进程。

我试图直接杀死它 – 拒绝。 此外,我试图产卵铬与detached:true旗,并再次杀死所有的subprocess,当主铬接收到“退出”信号,无论如何ps -A | grep chrome ps -A | grep chrome显示了两个不存在给我。 有任何想法吗?

UPD:感谢所有的帮助。 添加--init完全解决了我的问题。 使用另一个基本的图像也很好,但我决定这个方法不是必须的。 也可以在这里find根源的很好的描述

很多人认为,Linux系统上的init(或者systemd)在他们的父母死亡时收获僵尸进程。 父母应该用wait系统调用清理自己的僵尸进程。 但是,该自动清理不会传递容器的名称空间边界。 所以,无论你作为入门点运行的进程是什么,都需要为你处理这些僵尸。

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

除了dim -init之外, docker -init中还有一个tini ,它是docker使用的。

你需要一个调用wait() 进程来获取任何僵尸进程 。 在一个普通的系统上,这是由/sbin/init处理的,但是在一个容器中,你将需要提供你自己的工具。 如果您正在开发自己的应用程序,可以考虑定期在一个循环中调用wait()

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