Назад | Перейти на главную страницу

Как отправить сигнал в контейнер Docker, не влияя на политику перезапуска?

Пока 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