我正试图优雅地关闭我在码头容器中运行的服务(在运行raspbian的raspberry pi 3b上),因为只要发出“停靠停止”就会破坏服务(锁文件不会被清除)。
我的互联网研究显示,当脚本收到终止信号时,人们使用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时,就会出现‘关闭’的消息。-就像我想要的那样!
唯一的问题是,我似乎无法从docker容器外部获得发送到bash脚本的信号。我尝试过(在并行的ssh会话中):
docker kill --signal="INT" trap
docker kill --signal="SIGINT" trap此外,我尝试使用由“码头停止”发送的默认信号,但这导致控制台等待~10s (默认的停靠停止超时),然后杀死码头容器。
docker stop trap这两种方法都没有将消息“关闭”打印到屏幕上。
我真的很感谢你的帮助。
编辑1: --它也不适用于SIGTERM (当我执行以下命令之一,然后发出“停靠停止”时,我仍然没有收到消息“关闭”)。
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"解决方案:图像似乎是问题所在。入口点'/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
发布于 2016-10-31 10:00:40
正如我在注释中提到的,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
$发布于 2016-10-30 18:50:01
码头拦截和码头杀手正在发送信号,而不是陷阱命令。你必须做一个docker exec container_name trap
https://stackoverflow.com/questions/40332365
复制相似问题