Node.js docker里面的僵尸

Node.js docker里面的僵尸,node.js,linux,google-chrome,docker,Node.js,Linux,Google Chrome,Docker,我有一个docker容器,它运行node.js应用程序。此应用程序运行一个headless chrome实例 所有这些都可以很好地工作,但若我杀死chrome实例,并检查运行进程列表,我将看到系统中仍然有2个(实际上是3+2个cat进程)僵尸chrome进程(已失效)。我知道这是一个孩子 (指终止的母铬工艺),未正确完成并连接到初始工艺 我试图直接杀死它——被拒绝了。此外,我还尝试使用detached:true标志生成chrome,并再次直接杀死所有子进程,当主chrome收到“退出”信号时,无

我有一个docker容器,它运行node.js应用程序。此应用程序运行一个headless chrome实例

所有这些都可以很好地工作,但若我杀死chrome实例,并检查运行进程列表,我将看到系统中仍然有2个(实际上是3+2个cat进程)僵尸chrome进程(已失效)。我知道这是一个孩子 (指终止的母铬工艺),未正确完成并连接到初始工艺

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

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

您需要一个调用
wait()
的进程来获取任何结果。在常规系统上,这由
/sbin/init
处理,但在容器中,您需要提供自己的工具。如果您正在开发自己的应用程序,请考虑只在循环中调用<代码> WAITE()/<代码>。

可选的,你可以考虑一个容器特定的<代码> init < /C> >,看看是否解决了这个问题。

几乎是钉子的原因,Linux系统上的init(或SytD)在它们的父死亡时会重新收集僵尸进程。父进程应该使用
wait
syscall清理自己的僵尸进程。但是,自动清理不会通过容器的命名空间边界。因此,无论您作为入口点运行什么进程,并且成为pid 1,都需要为您处理这些僵尸

对于docker的最新版本,只需将
--init
传递到
docker run
命令,就可以包含init进程。如果您使用的是2.2版compose文件,则有一个选项
init:true
,您可以在服务上定义相同的结果


除了dumb init之外,docker还将其作为自己的docker init使用。

您的意思是只运行一个“root@daf1ccd11aaa:~/myapp#wait“在docker终端内(或调用node.js exec('wait',()={…}))?如果是,这没有帮助,如果我理解错误-请解释你的建议阅读有关僵尸进程的链接文章。在调用的容器中需要一个PID 1。使用类似于
dumbinit
(或
supervisord
或其他流程主管)的方法可以为您做到这一点。