当我在Docker容器中运行脚本并且脚本捕获EXIT并发送Ctrl+时C,Docker无法停止容器。
Docker文件
FROM alpine
RUN apk add --no-cache bash
COPY script.sh /
CMD ./script.sh
Run Code Online (Sandbox Code Playgroud)
script.sh
#!/bin/bash
func() {
echo "exit script"
}
trap func EXIT
echo "script"
sleep 30
Run Code Online (Sandbox Code Playgroud)
跑步
$ docker build -t traps .
$ docker run -it traps
Run Code Online (Sandbox Code Playgroud)
看到“脚本”回显后,按Ctrl+ C。
预期:打印“退出脚本”,然后容器退出,将控制权返回到我的终端,就像没有退出陷阱一样。
实际:已打印“退出脚本”,但容器仍在运行并保持在我的终端上。
使问题复杂化的是,如果添加SIGINT陷阱,事情将完全按照我的预期进行。命中Ctrl+时C,将首先触发SIGINT陷阱,然后触发EXIT陷阱,然后退出容器。
这是怎么回事?还有什么方法可以使工作正常而无需添加虚拟SIGINT陷阱?
(首先使用的原因-t是启用Ctrl+ C。)
我运行了你的文件并确定 bash 在按下 Ctrl-C 后进入了 100% CPU 状态。附加 gdb 或 strace 表示它无限地进行 SIGSEGVing。如果是这种情况,您可以通过将 shebang 更改为来解决此问题:
#!/bin/bash -i
Run Code Online (Sandbox Code Playgroud)
或者,CMD 命令:
CMD /bin/bash -i ./script.sh
Run Code Online (Sandbox Code Playgroud)
也许看看这个以获取更多信息:https://github.com/moby/moby/issues/4854
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |