如何向 Docker 容器发送信号而不影响重启策略?

如何向 Docker 容器发送信号而不影响重启策略?

TIL 这docker kill意味着杀死“让它死掉”,与 POSIX 意义上的“发送信号”相反。

我们有几个容器需要发送一个SIGHUP来重新加载配置,但这导致它们忽略“始终”的重启策略,这不是我们想要的。

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


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

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

$ docker inspect cloudwatch-exporter | jq .[].HostConfig.RestartPolicy
{
  "Name": "always",
  "MaximumRetryCount": 0
}

我们使用以下命令在某个时刻重新加载配置docker kill

$ docker kill --signal=SIGHUP cloudwatch-exporter
cloudwatch-exporter

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

$ docker exec cloudwatch-exporter bash -c "kill 1"

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

$ docker ps -a | grep cloudwatch-exporter
c7827204bba5        prom/cloudwatch-exporter:cloudwatch_exporter-0.8.0                                "java -jar /cloudwat…"   20 hours ago        Exited (143) 3 minutes ago                            cloudwatch-exporter

我们有什么替代方案docker kill? 在许多情况下docker exec有效,但它不适用于仅包含单个静态链接二进制文件的容器。

答案1

可以--signal选择吗docker kill

docker kill --signal=SIGHUP <container>

或者与docker exec

docker exec <container> killall -HUP nginx

答案2

这是一个已知的 Docker 错误。

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

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

通过执行以下操作来绕过该问题docker exec "kill -HUP 1"

相关内容