Кто-нибудь знает, есть ли способ, чтобы роутер-докер перезапускал одну службу, которая является частью стека, без перезапуска всего стека?
Перезапустить одну службу в стеке докеров
Ответ 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
будут перезапущены только те службы, для которых обновлен дайджест или тег:
По моему опыту, когда я снова разверну тот же стек со сменой одного сервиса, будет перезапущен только обновленный сервис.
НО... кажется, есть некоторые ограничения для изменений, которые принимаются во внимание (некоторые ошибки отчета с тегами изображений), поэтому попробуйте и посмотрите, работает ли как ожидалось.
Вы также можете использовать service update
если вы хотите быть уверенным, что только целевой сервис, если обновляется с вашими изменениями.
Ответ 4
убери это:
docker stack rm stack_name
повторно разверните его:
docker stack deploy -c docker-compose.yml stack_name