脚本捕获EXIT时docker挂在SIGINT上

时间:2019-02-14 21:24:26

标签: bash docker

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

预期:打印“退出脚本”,然后容器退出,将控制权返回到我的终端,就像没有退出陷阱一样。

实际:已打印“退出脚本”,但容器仍在运行并保持在我的终端上。

使事情复杂化的是,如果添加SIGINT陷阱,事情将按照我的预期进行。按下 Ctrl + C 时,首先触发SIGINT陷阱,然后退出EXIT陷阱,然后退出容器。

这是怎么回事?无需添加虚拟SIGINT陷阱,有什么方法可以使事情正常进行?

(首先使用-t的原因是启用 Ctrl + C 。)

1 个答案:

答案 0 :(得分:1)

我运行了文件,并确定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