当我在docker容器中运行脚本,并且脚本陷阱EXIT,并且我发送了Ctrl C时,docker无法停止容器.
Dockerfile
FROM alpine
RUN apk add --no-cache bash
COPY script.sh /
CMD ./script.sh
script.sh
#!/bin/bash
func() {
echo "exit script"
}
trap func EXIT
echo "script"
sleep 30
跑步
$docker build -t traps .
$docker run -it traps
看到“脚本”回显后,按Ctrl C.
预期:打印“退出脚本”,容器退出,将控制权返回给我的终端,就像没有EXIT陷阱一样.
实际:打印“退出脚本”,但容器仍在运行并保持在我的终端上.
更复杂的是,如果我添加一个SIGINT陷阱,事情就像我期望的那样完成.在按下Ctrl C时,首先触发SIGINT陷阱,然后触发EXIT陷阱,然后退出容器.
这是怎么回事?是否有任何方法可以在不添加虚拟SIGINT陷阱的情况下使其工作?
(首先使用-t的原因是启用Ctrl C.)
最佳答案 我运行你的文件并确定bash在按下Ctrl-C后进入100%CPU状态.附加gdb或strace表示它是无限的SIGSEGVing.
如果是这种情况,您可以通过将shebang更改为:
#!/bin/bash -i
或者,CMD命令:
CMD /bin/bash -i ./script.sh
也许请查看此信息以获取更多信息:https://github.com/moby/moby/issues/4854