如何修复Docker容器中的ctrl + c

如果我连接到docker集装箱

$> docker exec -it my_container zsh 

在里面我想杀了我用ctrl+c开始的东西我注意到它需要永远完成。 我google了一下,似乎ctrl+c作品有点不同于你所期望的。 我的问题,我怎样才能修复ctrl+c里面的容器?

问题在于Ctrl-C向容器中的顶级进程发送一个信号,但是这个过程并不像你所期望的那样反应。 顶层进程在容器中有ID 1,这意味着它不会得到进程通常具有的默认信号处理程序。 如果顶层进程是一个shell,那么它可以通过自己的处理程序接收信号,但不会将其转发到在shell中执行的命令。 细节在这里解释。 在这两种情况下,Docker容器的行为就好像只是简单地忽略了Ctrl-C。

docker 0.6.5开始,您可以将-t添加到docker 0.6.5 run命令中,该命令将附加一个pseudo-TTY 。 然后,您可以键入Control-C从容器中分离而不终止它。

如果使用-t-i则Control-C将终止该容器。 当使用-i with -t则必须使用Control-P Control-Q进行分离而不终止。

testing1:

 $ ID=$(sudo docker run -t -d ubuntu /usr/bin/top -b) $ sudo docker attach $ID Control-C $ sudo docker ps 

容器仍然列出。

testing2:

 $ ID=$(sudo docker run -t -i -d ubuntu /usr/bin/top -b) $ sudo docker attach $ID Control-C $ sudo docker ps 

该容器不在(它已经被终止)。 如果在第二个示例中键入Control-P Control-Q而不是Control-C,则容器仍将运行。

使用docker-entrypoint.sh bash脚本封装程序,该脚本阻止容器进程并能够捕获ctrl-c。 这个bash示例应该有所帮助: https : //rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash

使用Ctrl + \而不是Ctrl + C
它杀死的过程,而不是礼貌地要求它closures( 在这里阅读更多)。