如何在不影响重启策略的情况下向 Docker 容器发送信号?

lee*_*777 8 signals docker

TILdocker kill意思是“杀死”,意思是“让它死”,而不是 POSIX 意义上的“发送信号”。

\n

我们有几个集装箱需要发送SIGHUP以重新加载配置,但这会导致它们忽略“始终”的重新启动策略,这不是我们想要的。

\n

在不影响这些容器自动重启能力的情况下向这些容器发送信号的最佳方式是什么?

\n
\n

为了更清楚地展示我们所看到的问题,请看以下示例。

\n

我们有一些容器的重启策略设置为始终

\n
$ docker inspect cloudwatch-exporter | jq .[].HostConfig.RestartPolicy\n{\n  "Name": "always",\n  "MaximumRetryCount": 0\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我们在某个时候重新加载配置docker kill

\n
$ docker kill --signal=SIGHUP cloudwatch-exporter\ncloudwatch-exporter\n
Run Code Online (Sandbox Code Playgroud)\n

一段时间后,发生了一些事情终止了该进程。为了模拟这一点,我将在容器内发送一个信号:

\n
$ docker exec cloudwatch-exporter bash -c "kill 1"\n
Run Code Online (Sandbox Code Playgroud)\n

此时,容器已死亡并且不会重新启动:

\n
$ docker ps -a | grep cloudwatch-exporter\nc7827204bba5        prom/cloudwatch-exporter:cloudwatch_exporter-0.8.0                                "java -jar /cloudwat\xe2\x80\xa6"   20 hours ago        Exited (143) 3 minutes ago                            cloudwatch-exporter\n
Run Code Online (Sandbox Code Playgroud)\n

我们有哪些替代方案可以使用docker kill?对于很多情况docker exec可行,但它不适用于仅包含单个静态链接二进制文件的任何容器。

\n

小智 7

这是一个已知的 Docker 错误。

请参阅https://github.com/moby/moby/issues/11065 “非致命信号破坏重启策略”

请参阅https://github.com/moby/moby/issues/41302 “信号中断,除非停止重启策略”

通过执行来绕过问题docker exec "kill -HUP 1"

  • ....7年后,他们仍然没有解决这个问题:/ (2认同)

Mic*_*ton 5

可以--signal选择docker kill?

docker kill --signal=SIGHUP <container>
Run Code Online (Sandbox Code Playgroud)

或者与docker exec

docker exec <container> killall -HUP nginx
Run Code Online (Sandbox Code Playgroud)