加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 20:55:13 所属栏目:安全 来源:网络整理
导读:当我在docker容器中运行脚本,并且脚本陷阱EXIT,并且我发送了Ctrl C时,docker无法停止容器. Dockerfile FROM alpineRUN apk add --no-cache bashCOPY script.sh /CMD ./script.sh script.sh #!/bin/bashfunc() { echo "exit script"}trap func EXITecho "scri
当我在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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读