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

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


person tweeks200    schedule 28.06.2017    source источник


Ответы (5)


Повторение 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 заставит службу обновиться, что приведет к ее перезапуску.

person Matt    schedule 13.02.2018

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

docker service scale myservice=0
docker service scale myservice=10
person Luke W    schedule 31.03.2018
comment
это единственный, который действительно вызывает перезапуск. Спасибо! - person the_ccalderon; 01.05.2018
comment
согласен, просто принудительное обновление не перезапустило службу для меня, не знаю почему - person Egor; 15.05.2018
comment
Хотя этот метод, кажется, останавливает службу, но каким-то образом служба остается скрытой глубоко в недрах зверя. Например, я получаю сообщение «порт уже используется», когда я уменьшаю масштаб службы и пытаюсь запустить другой, использующий тот же порт. - person netlander; 02.11.2020

Изучив документацию docker stack:

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

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

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

процесс стека докеров

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

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

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

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

person François Maturel    schedule 30.06.2017
comment
Спасибо, все работает как положено. На самом деле я хочу принудительно перезапустить одну конкретную службу (или весь стек) непрерывно. К сожалению, у некоторых служб, с которыми я работаю, есть проблема с аннулированием кеша, и мы обнаружили, что нам нужно удалить / повторно развернуть в стеке, чтобы принудительно обновить. Глядя на service update документацию, я мог бы добавить / удалить env переменные, чтобы подделать это, если нет встроенного способа. - person tweeks200; 21.07.2017
comment
Искал то же самое - не нашел в документации. - person Morgan Kobeissi; 03.08.2017
comment
Я только что указал на следующую проблему: docker stack deploy не запускает службу (openldap). Я не смог найти файл журнала. docker-compose run <service> запустит контейнер без проблем. Наконец, docker service update --force <servce>действовал. - person rhoerbe; 05.06.2019

В соответствии с примером в документации для скользящих обновлений:

$ docker service update --image redis: 3.0.7 redis

Однако это работает только в том случае, если ваш образ уже находится на локальных машинах. Если нет, то вам нужно использовать --with-registry-auth для отправки данных аутентификации реестра агентам роя. Подробную информацию см. В документации по обновлению службы Docker.

$ docker service update --with-registry-auth --image redis: 3.0.7 redis

person Robert Wasmann    schedule 03.04.2020

убери это:

docker stack rm stack_name

развернуть его:

docker stack deploy -c docker-compose.yml stack_name
person Xiaorong Liao    schedule 19.07.2019
comment
Принятый ответ выше работает и делает это непрерывно, чтобы избежать простоев. - person tweeks200; 22.07.2019