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


79

Хто-небудь знає, чи є спосіб змусити докер-рій перезапустити одну службу, яка є частиною стека, без перезапуску цілого стека?

Відповіді:


109

Повторна робота 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Прапор змусить послугу поновлення , змушуючи його перезапустити.


68

Шкала до 0 і резервне копіювання:

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

2
це єдиний, який фактично змушує перезапустити. Дякую!
the_ccalderon

1
погодьтеся, просто примусове оновлення не перезапустило службу для мене, не знаю чому
Єгор

Хоча цей спосіб, здається, зупиняє службу, але якось служба все ще залишається ховатися глибоко в надрах звіра. Наприклад, я отримую `` порт вже використовується '', коли зменшую службу і намагаюся закрутити інший, який використовує той самий порт.
netlander

14

Перегляд docker stackдокументації:

Розширений опис

Створіть та оновіть стек із файлу композиції або файлу мазки на рої

З цієї статті в блозі : docker stackпрацює подібним чином docker compose. Це ідемпотентно . Якщо стек вже розгорнуто, docker stack deployбуде перезапущено лише ті служби, у яких є дайджест або тег, який оновлено:

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

З мого досвіду, коли я знову розгортаю той самий стек із зміною однієї служби, буде перезапущено лише оновлену службу .

АЛЕ ... , схоже, є деякі обмеження щодо змін, які враховуються (деякі повідомлення про помилки з тегами зображень ), тому спробуйте і подивіться, чи працює, як очікувалося.

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

Ви також можете звернутися до подібного SO QA .


Дякую, це працює як слід. Я насправді прагну примусити перезапустити одну конкретну службу (або весь стек) поступово. На жаль, деякі служби, з якими я маю справу, мають проблеми з ануляцією кешу, і ми виявляємо, що нам потрібно видалити / повторно розгорнути стек, щоб змусити оновлення. Переглядаючи service updateдокументацію, я міг би додавати / видаляти envзмінні, щоб підробити це, якщо немає вбудованого способу.
tweeks200

Просто шукав те саме - не міг знайти жодного в документах.
Morgan Kobeissi

Я щойно зіткнувся з такою проблемою: docker stack deployне запускав службу (openldap). Не вдалося знайти файл журналу. docker-compose run <service>запустив би контейнер без проблем. Нарешті, docker service update --force <servce>зробив роботу.
rhoerbe

0

Відповідно до прикладу в документації для прокатки оновлень:

Оновлення служби $ docker --image redis: 3.0.7 redis

Однак це працює, лише якщо ваше зображення вже на локальних машинах. Якщо ні, тоді вам потрібно використовувати --with-registry-auth для надсилання деталей автентифікації реєстру агентам рою. Детальніше див. У документації оновлення служби докера.

Оновлення служби $ docker --with-registry-auth --image redis: 3.0.7 redis


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.