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"
。