当我的 Dockerfile 结尾时
CMD node .
docker 使用以下命令运行该容器/bin/sh -c "node ."
而不是简单地node .
(我知道,我可以这样做CMD ["node", "."]
).
我认为这种行为实际上很好,因为这意味着在容器内部PID1
is /bin/sh
而不是我简陋的节点脚本。
如果我理解正确的话PID1
负责收获孤立的僵尸进程,我真的不想为此负责......所以如果/bin/sh
能做到这一点,那就太好了。 (我实际上认为这就是 docker 重写我的原因CMD
).
问题是当我发送一个SIGTERM
到容器(开始于/bin/sh -c "node ."
),或者通过docker-composer stop
or docker-composer kill -s SIGTERM
,信号没有到达我的node
进程,因此每次都会被强行杀死SIGKILL
10 秒宽限期后。不太好。
有没有办法让人管理我的僵尸并让我的节点实例接收docker发送的信号?
我认为你必须了解以下角色ENTRYPOINT
and CMD
,并使用ENTRYPOINT
(执行形式)以你的方式Dockerfile
.
ENTRYPOINT
,指定容器的起始可执行文件,是Docker容器的核心部分。每个集装箱MUST有一个入口点来决定从哪里开始。默认值为/bin/bash -c
。此外,所有设置CMD
将被附加到ENTRYPOINT
作为参数。
因此,如果您未能指定ENTRYPOINT
在你的Dockerfile
,实际的入口点是/bin/bash -c {your_command_in_CMD}
,不幸的是DOES NOT传递信号。
ENTRYPOINT
有两种形式:执行形式 and 贝壳形式
- 执行形式:ENTRYPOINT ["可执行文件", "param1", "param2"]
- shell形式:命令 param1 param2
As the Docker 参考 https://docs.docker.com/engine/reference/builder/#entrypoint指出:推荐使用exec形式,shell形式的缺点是command执行者/bin/bash -c
,这可能不适用于信号:
The 贝壳形式防止任何CMD
or run
命令行参数被使用,但缺点是你ENTRYPOINT
将作为子命令启动/bin/sh -c
,不传递信号。这意味着可执行文件不是容器的PID 1
- and will not接收 Unix 信号 - 所以你的可执行文件不会接收SIGTERM
from docker stop <container>
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)