Период отсрочки остановки роя Docker не работает должным образом - PullRequest
0 голосов
/ 11 марта 2019

Я запускаю Docker в режиме роя с несколькими узлами в кластере.Согласно документации, написанной здесь: https://docs.docker.com/engine/reference/commandline/service_update/ и здесь: https://docs.docker.com/engine/reference/commandline/service_create/, - команда -stop-grace-period устанавливает время ожидания перед принудительным уничтожением контейнера.

Ожидаемое поведение - Я ожидал, что Docker будет ждать этот период времени, пока он не попытается остановить работающий контейнер, во время обновления обновления.

Фактическое поведение - Docker отправляет завершениечерез несколько секунд сигнализирует о запуске нового контейнера с новой версией образа.

Действия по воспроизведению поведения

  1. docker service create --replicas 1 --stop-grace-period60 с --update-delay 60 с - update-monitor 5 с - update-order start-first --name nginx nginx: 1.15.8
  2. Подождите, пока служба запустит контейнер (примерно 2 минуты)
  3. обновление службы докера --image nginx: 1.15.9 nginx
  4. docker ps -a enter image description here
  5. Как видите,начался новый контейнер и через секунду док был убит Докомker.

Есть идеи почему?

Я также открыл вопрос о Github, здесь: https://github.com/docker/for-linux/issues/615

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Значение --stop-grace-period - это период времени, в течение которого Docker будет ждать после отправки сигтерма и перестанет ждать, пока контейнер не выйдет изящно. По истечении льготного периода контейнер убивается сигкилом.

Последовательность событий, кажется, происходит, как разработано на основе вашего описания вашей установки. Ваш контейнер выходит чисто и быстро, когда получает сигтер, поэтому Docker никогда не нужно отправлять сигкилл.

Я вижу, вы также указали --update-delay 60, но это не вступит в силу, поскольку у вас есть только одна реплика. Задержка обновления скажет докеру подождать 60 секунд после циклического выполнения первой задачи, поэтому это полезно только для 2 или более реплик.

Похоже, что вы хотите, чтобы ваша служба с одной репликой запускала новую задачу и старую задачу одновременно в течение 60 секунд, но режим роя рад избавиться от старых контейнеров с sigterm, как только новый контейнер будет запущен.

0 голосов
/ 11 марта 2019

Я думаю, что вы можете закрыть проблему на GitHub.

stop-grace-period это период между остановкой (SIGTERM) и убийством (SIGKILL).

Конечно, вы можетеизмените SIGTERM на другой сигнал с помощью переключателя --stop-signal.Ответственность за поведение приложения в контейнере при получении сигнала остановки.

Здесь хорошая статья, объясняющая эту кухню.

...