Пока 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
работает, но не будет работать для любого контейнера, который содержит только один двоичный файл с статической связью.
С --signal
возможность docker kill
?
docker kill --signal=SIGHUP <container>
Или с docker exec
?
docker exec <container> killall -HUP nginx