如果我连接到 docker 容器
$> docker exec -it my_container zsh
在里面我想杀死我开始的东西ctrl+c
我注意到它需要很长时间才能完成。我用谷歌搜索了一下,似乎ctrl+c
工作原理与您的预期有点不同。我的问题,我该如何解决ctrl+c
在容器内?
问题是 Ctrl-C 向容器内的顶级进程发送信号,但该进程不一定会按照您的预期做出反应。顶级进程在容器内的 ID 为 1,这意味着它无法获取进程通常具有的默认信号处理程序。如果顶层进程是 shell,那么它可以通过自己的处理程序接收信号,但不会将其转发到 shell 内执行的命令。详细说明here https://engineeringblog.yelp.com/2016/01/dumb-init-an-init-for-docker.html#process-behavior-inside-docker-containers。在这两种情况下,docker 容器的行为就好像它只是忽略 Ctrl-C。
从...开始docker 0.6.5
, 你可以加-t
到 docker run 命令,该命令将附加一个pseudo-TTY
。然后你可以输入Control-C
与容器分离而不终止它。
如果你使用-t
and -i
然后 Control-C 将终止容器。使用时-i
with -t
那么你必须使用Control-P Control-Q
分离而不终止。
Test 1:
$ ID=$(sudo docker run -t -d ubuntu /usr/bin/top -b)
$ sudo docker attach $ID
Control-P Control-Q
$ sudo docker ps
该容器仍然列出。
Test 2:
$ 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 https://rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash
#!/bin/bash
# trap ctrl-c and call ctrl_c()
trap ctrl_c INT
function ctrl_c() {
echo "** Trapped CTRL-C"
}
for i in `seq 1 5`; do
sleep 1
echo -n "."
done
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)