2017-07-17 42 views
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。

+0

什么命令启动的容器?什么版本的Docker?什么主机操作系统我们可以看到'Dockerfile'吗? –

回答

0

请问这是什么用途? 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。

+0

感谢这个我指出了正确的方向。一些阅读和谷歌搜索后,我也发现了这一点,这似乎是一个很好的解决方案,可能运行的泊坞窗容器时,一个好主意:https://docs.docker.com/engine/reference/run/#specify-an-init-处理 – Otto