如何修复 docker 容器内的 ctrl+c

2024-03-31

如果我连接到 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(使用前将#替换为@)

如何修复 docker 容器内的 ctrl+c 的相关文章

随机推荐