我为什么不能CTRL-C在泊坞窗睡眠无穷大时,它会作为PID 1
案例:我们有运行,需要一个bash脚本泊坞窗容器“块”永远的(因为它暴露了另一个容器容积,但为什么我们有时需要这样的其他原因)。我为什么不能CTRL-C在泊坞窗睡眠无穷大时,它会作为PID 1
我想这可能是工作,那么:然后
exec sleep infinity;
的ps aux给“睡眠”为PID 1太好了,我想,那么它会收到我们从容器外部发送信号。例如:
docker kill -s INT container_name
但是,这不起作用,容器继续运行(也适用于SIGTERM)。正常击杀的工作,但我不明白为什么有区别(这惹恼了我很大):
docker kill container_name
为什么我不能杀“睡眠”与SIGINT/SIGTERM,当它在运行作为PID 1我的容器?我相信,当他们在一个容器中PID 1来看,我可以杀死其他的东西(像的bash脚本)与SIGINT/SIGTERM。
请问这是什么用途? https://www.fpcomplete.com/blog/2016/10/docker-demons-pid1-orphans-zombies-signals
基本上问题是进程号1. Linux/unix内核不情愿以常规方式发信号通知进程,因为它应该是init。如果init进程死亡,系统立即发出恐慌并重新启动。如果您的进程1没有处理信号的信号,信号就会被丢弃。睡眠没有处理任何信号的处理程序,但是您可以构建一个脚本来打击脚本。
基本上你需要做的是使用EXEC形式在dockerfile,和你的睡眠无限分裂成环路,而外壳是执行命令的bash陷阱不会被触发。这将信号发送到正在运行的进程1和捕获它:
Dockerfile:
FROM ubuntu
ADD foo.sh /tmp
RUN ["/tmp/foo.sh"]
foo.sh:
#!/bin/bash
trap "echo signal;exit 0" SIGINT
while :
do
sleep 1
done
这将反应以泊坞窗杀--signal = SIGINT。
感谢这个我指出了正确的方向。一些阅读和谷歌搜索后,我也发现了这一点,这似乎是一个很好的解决方案,可能运行的泊坞窗容器时,一个好主意:https://docs.docker.com/engine/reference/run/#specify-an-init-处理 – Otto
什么命令启动的容器?什么版本的Docker?什么主机操作系统我们可以看到'Dockerfile'吗? –