当脚本陷阱EXIT时,bash – docker在SIGINT上挂起

当我在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

点赞