Как отложить Docker Swarm для обновления контейнера с сохранением состояния, пока он не будет готов? - PullRequest
0 голосов
/ 06 июля 2018

Проблемный домен

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

Например, база данных, импортирующая дамп в несколько ГБ.

Существует также система CI / CD, которая заботится о создании новых версий контейнеров и их развертывании в Swarm или передаче образа в Docker Hub, который затем вызывает определенный веб-крюк, который запускает событие развертывания.

Вопрос

Можно ли как-нибудь собрать свои контейнеры, чтобы Swarm мог знать, нормально ли это обновлять или нет? Точно так же, как HEALTHCHECK сообщает, нужно ли его перезапускать, что позволит Swarm знать, что «теперь безопасно перезапустить этот контейнер».

Или система CI / CD отвечает за проверку безопасности перезапуска контейнеров с сохранением состояния и только после этого запускает команду обновления для роения?

Заранее спасибо!

1 Ответ

0 голосов
/ 06 июля 2018

Docker не проверит с контейнером, готов ли он быть остановленным, как только вы дадите docker команду остановить контейнер, он выполнит это действие. Однако он выполняет остановку в два этапа. Первый шаг - SIGTERM, который ваш контейнер может ловить и изящно обрабатывать. По умолчанию через 10 секунд отправляется SIGKILL, который немедленно применяется ядром Linux и не может быть перехвачен контейнером. Для ваших целей вы должны убедиться, что ваше приложение знает, когда можно безопасно выйти после получения первого сигнала, и, возможно, вам захочется увеличить время между сигналами намного дольше, чем 10 секунд.

Проверка работоспособности не скажет докеру, что ваш контейнер находится в безопасной точке для остановки. Он сообщает Swarm, когда ваш контейнер закончил запуск, или когда он плохо себя ведет, и его нужно остановить и заменить. Healthcheck определяет команду для запуска внутри вашего контейнера, а код выхода проверяется на то, является ли он 0 (исправен) или 1 (неработоспособен). Другие коды выхода в настоящее время не действительны.

Если вам нужно нечто большее, чем простая обработка сигналов внутри контейнера, тогда да, вы, вероятно, перемещаете стек вверх к инструменту ci / cd для управления развертыванием.

...