为什么我不能在Docker中运行PID 1时CTRL-C睡眠无限

案例:我们有一个Docker容器,它运行一个需要永远“阻塞”的bash脚本(因为它暴露了另一个容器的容量,但是为什么我们有时需要这个容器)。

我认为这可以工作,然后:

exec sleep infinity; 

ps aux然后给出“睡眠”作为PID 1.很好,我想,那么它会收到我们从容器外部发送的信号。 例如:

 docker kill -s INT container_name 

但是这不起作用,容器继续运行(也为SIGTERM)。 一个正常的杀死工作,但我不明白为什么有一个区别(这让我非常恼火):

 docker kill container_name 

为什么我不能用SIGINT / SIGTERM在我的容器中作为PID 1运行时终止“睡眠”? 我相信我可以使用SIGINT / SIGTERM杀死其他东西(如bash脚本),当它们在容器中作为PID 1运行时。

这会有什么用? https://www.fpcomplete.com/blog/2016/10/docker-demons-pid1-orphans-zombies-signals

基本上问题是进程号1. Linux / unix内核不愿意以常规的方式表示进程,因为它应该是init。 如果init进程死亡,系统立即发出恐慌并重新启动。 如果你的进程1没有一个信号处理程序,信号就会被丢弃。 睡眠没有处理任何信号,但你可以build立一个bash脚本。

基本上你需要做的是在你的dockerfile中使用execforms,然后把你的sleep infinity分割成一个循环,因为在shell执行命令的时候,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 

这将对docker kill –signal = SIGINT做出反应。

    Interesting Posts