我试图优雅地关闭我在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
答案 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