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
有效,但它不适用于仅包含单个静态链接二进制文件的任何容器。
这是一个已知的 Docker 错误。
请参阅https://github.com/moby/moby/issues/11065 “非致命信号中断重启策略”
请参阅https://github.com/moby/moby/issues/41302 “信号中断,除非停止重启策略”
通过做绕过问题
docker exec "kill -HUP 1"
。可以
--signal
选择docker kill
?还是与
docker exec
?