Как я могу обновить последний образ, который использует мой сервис/стек докеров?

В определении .yml я всегда извлекаю образ latest своего сервиса.

Когда я помещаю новый образ в реестр и хочу обновить образ, который использует служба в моем стеке. Я не вижу никакого флага --pull и документации для обновления службы Docker прямо не упоминает об этом.

Как выполнить повторное развертывание с использованием недавно загруженного образа latest?


person Christopher Francisco    schedule 19.06.2018    source источник
comment
Первое предложение было бы не использовать :latest. Честно говоря, чем больше я использую Docker, тем больше вижу проблем, связанных с использованием этого тега.   -  person SiHa    schedule 19.06.2018
comment
У нас еще нет надежной настройки CI для автоматической пометки и прочего, поэтому на данный момент наш CI может выполнять только :latest.   -  person Christopher Francisco    schedule 19.06.2018


Ответы (3)


Вы на самом деле не должны использовать latest в производственной среде или где-либо еще, кроме тестирования/обучения на локальной машине. Это делает все неоднозначным в отношении того, какой образ вы используете, и вы не можете сказать в docker service ls/ps, является ли он текущим по умолчанию, и всевозможные другие неоднозначности (например, SHA не отображается в графическом интерфейсе Docker Hub).

Если у вас нет другого выхода, по крайней мере, Swarm пытается запросить ваш реестр и проверить наличие обновленного SHA. Если он увидит один с docker service update --image <username>/<repo> <servicename>, он вытянет и выполнит непрерывное обновление. Вы можете посмотреть docker events, чтобы убедиться, что все происходит, и вы можете использовать docker service ps --no-trunc <servicename>, чтобы потом проверить и увидеть хэши SHA старых и новых изображений.

person Bret Fisher    schedule 21.06.2018
comment
Спасибо за чаевые! Среда не является производственной, это просто временная среда интеграции, пока команда devops не получит право собственности. - person Christopher Francisco; 21.06.2018
comment
Так что просто запустите docker service update с флагом --image, верно? - person Christopher Francisco; 21.06.2018
comment
К вашему сведению, последняя версия Portainer (1.18.0) дает вам возможность обновлять службу одним щелчком мыши и принудительно устанавливать новое разрешение дайджеста изображения (которое обновит изображение, связанное со службой). - person Tony; 22.06.2018

Если вы используете компоновочный файл для развертывания службы. Я бы не рекомендовал использовать эту команду:

docker service update --image <username>/<repo> <servicename>    

Это приводит к тому, что ваш файл устаревает и больше не является источником записи для конфигурации службы. Вместо этого обновите файл компоновки, указав конкретную версию образа, как предложил Брет Фишер, и выполните следующую команду:

docker stack up -c </path/to/compose.yml> <servicename>

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

person D.Fitz    schedule 15.05.2020
comment
Эй, спасибо за ответ. Я сделал обновление, и была горячая минута, когда старый контейнер не работал, а новый еще не работал. У меня есть только одна реплика, но я ожидал, что новый контейнер появится до закрытия старого. Есть ли способ сделать это? Или мне нужно иметь более одной реплики? - person duct_tape_coder; 25.08.2020
comment
Я бы попробовал начальный порядок в разделе компоновки «обновление-конфигурация». docs.docker.com/compose/compose-file/#update_config - person D.Fitz; 26.08.2020

Чтобы добавить к ответу Брета Фишера, запуск docker stack deploy -c compose-file.yml с тем же файлом compose-file.yml и наличие образа, помеченного как latest, действительно сравнит SHA изображений и при необходимости повторно развернет образ соответствующего сервиса.

Это благодаря флагу --resolve-image, добавленному в Docker 17.09, который по умолчанию равен always.

И во время тестирования я обнаружил, что при необходимости он даже загружает новейшее изображение.

Связанная проблема GitHub: https://github.com/moby/moby/issues/30951#issuecomment-342647614.

person Scotow    schedule 16.11.2019