bash script命令"陷阱"不在docker容器中工作

时间:2016-10-30 18:45:00

标签: linux bash docker raspberry-pi

我试图优雅地关闭我在docker容器中运行的服务(在运行raspbian lite的树莓上运行),因为只是发出了#docker stop'打破服务(锁定文件不会被清除)

我的互联网研究表明,人们正在使用bash命令'陷阱'当脚本收到要终止的信号时执行命令。

我试过以下内容:

docker run --rm -it --name trap resin/rpi-raspbian:jessie /bin/bash -c " trap 'echo shutting down ; exit' INT; echo waiting; read"

当我跑过命令时,等待'正在打印到屏幕上,当我按下CTRL + C时,消息“关闭”#39;出现。 - 正如我想要的那样!

唯一的问题是,我似乎无法从docker容器外部将该信号发送到bash脚本。我已经尝试过(在并行的ssh会话中):

docker kill --signal="INT" trap
docker kill --signal="SIGINT" trap

此外,我尝试使用&#39; docker stop&#39;发送的默认信号,但这导致控制台等待〜10s(默认的docker stop timeout),然后终止docker容器。< / p>

docker stop trap

这两种方法都没有收到消息&#39;关闭&#39;打印到屏幕上。

我真的很感激任何帮助。

编辑1: 它也不能与SIGTERM一起使用(当我执行以下任一命令,然后发出“停靠码头”时,我仍然没有收到消息&#39;关闭&#39; )。

docker run --rm -it --name trap resin/rpi-raspbian:jessie /bin/bash -c " trap 'echo shutting down ; exit' TERM; echo waiting; read"
docker run --rm -it --name trap resin/rpi-raspbian:jessie /bin/bash -c " trap 'echo shutting down ; exit' SIGTERM; echo waiting; read"

解决方法: 图像似乎是问题所在。入口点&#39; /usr/bin/entry.sh'陷阱信号。我用另一张图片尝试过它并且有效:

$ docker run -it --name trap digitallyseamless/archlinux-armv6h /bin/bash -c " trap 'echo shutting down ; exit 0' SIGTERM; echo waiting; read"

使用(从其他终端)停止容器

$ docker stop trap

然后查看容器输出

$ docker logs trap
waiting
shutting down

由于我没有特别需要使用特定的图像(它实际上只是让我达到目标的一种手段),我只是换掉图像。

PS: 非常感谢@tkausl

2 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,docker stop发送了SIGTERM。根据您的编辑,这对您不起作用,但是,我只是尝试使用完全相同的命令(虽然将图像更改为ubuntu)并且它可以正常工作。你可能正在从跑步箱中脱身吗?在这种情况下,您显然看不到该消息,请移除--rm标记并查看docker logs

我是怎么做到的:

在一个终端:

docker run --rm -it --name trap ubuntu /bin/bash -c " trap 'echo shutting down ; exit' SIGTERM; echo waiting; read"

在第二个终端:

$ docker stop f6
f6

停止后我在第一个终端看到的内容:

$ docker run --rm -it --name trap ubuntu /bin/bash -c " trap 'echo shutting down ; exit' SIGTERM; echo waiting; read"
waiting
shutting down    
$

答案 1 :(得分:0)

Docker stop和docker kill正在发送信号而不是trap命令。你必须做一个docker exec container_name trap