Перезапустить одну службу в стеке докеров

Кто-нибудь знает, есть ли способ, чтобы роутер-докер перезапускал одну службу, которая является частью стека, без перезапуска всего стека?

Ответ 1

Выполнение docker stack deploy снова для меня - это путь к обновлению сервисов. Как Ответ Франсуа, а также на моем собственном опыте, он обновляет только те сервисы, которые необходимо обновить.

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

Получите идентификатор службы, который вы хотите снести, затем используйте docker service update --force <id>, чтобы принудительно обновить службу, которая эффективно повторно развернет ее.

$ docker stack services <stack_name>
ID                  NAME              ...
3xrdy2c7pfm3        stack-name_api    ...

$ docker service update --force 3xrdy2c7pfm3

Флаг --force заставит службу обновляться, заставляя ее перезагрузиться.

Ответ 2

Масштаб до 0 и резервное копирование:

docker service scale myservice=0
docker service scale myservice=10

Ответ 3

Глядя на док-документацию docker stack:

Расширенное описание

Создайте и обновите стек из файла compose или dab на рое

Из этой статьи блога: docker stack работает аналогично тому, как работает docker compose. Его идемпотент. Если стек уже развернут, при docker stack deploy будут перезапущены только те службы, для которых обновлен дайджест или тег:

docker stack process

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

НО... кажется, есть некоторые ограничения для изменений, которые принимаются во внимание (некоторые ошибки отчета с тегами изображений), поэтому попробуйте и посмотрите, работает ли как ожидалось.

Вы также можете использовать service update если вы хотите быть уверенным, что только целевой сервис, если обновляется с вашими изменениями.

Вы также можете обратиться к этой аналогичной SO QA.

Ответ 4

убери это:

docker stack rm stack_name

повторно разверните его:

docker stack deploy -c docker-compose.yml stack_name