Ответ 1
Только для справок в будущем:
Docker 1.13 добавил флаг --force
в service update
:
--force
: принудительно обновлять, даже если никаких изменений не требуется
Используйте его как в:
docker service update --force service_name
окружающая среда
Есть ли способ заставить скользящее обновление уже запущенной службы старта докеров, если обновление службы не меняет никаких параметров, но изображение узла-докеры обновлено?
Пример: я развернул службу:
docker service create --replicas 1 --name servicename --publish 80:80 username/imagename:latest
Мой процесс сборки обновил последнее изображение на докере-концентраторе, теперь я хочу снова вытащить последнее.
Я пробовал работать:
docker service update --image username/imagename:latest servicename
Когда я следую этому процессу, докер не вытягивает последнее, я предполагаю, что он предполагает, что, поскольку я хотел, чтобы последние и докер уже вытащили изображение: последнее, тогда нечего делать.
Единственная работа, с которой я работаю, - удалить служебное имя сервиса и перераспределить.
Только для справок в будущем:
Docker 1.13 добавил флаг --force
в service update
:
--force
: принудительно обновлять, даже если никаких изменений не требуется
Используйте его как в:
docker service update --force service_name
Docker не будет автоматически выполнять откат от DockerHub (или частного реестра) для изображения: тег, который у вас уже есть локально.
Если вы выполнили ручное нажатие до docker service update
или удалили изображение локально, это будет.
Вы также можете связать команду:
docker pull image:tag && docker service update --image username/imagename:latest servicename
Вы можете избежать этого сценария, пометив ваши изображения численно и используя обновленный тег. username/imagename:1.1.0
Вы можете использовать идентификатор изображения вместо имени username/imagename:latest
следующим образом:
docker service update --image \
$(docker inspect --type image --format '{{.Id}}' username/imagename:latest) \
servicename
Но в этом случае все ваши узлы должны вытащить это изображение перед обновлением службы. В противном случае контейнеры будут обновляться только на тех узлах, где существует изображение с таким идентификатором. К счастью, узлы, которые не имеют этого изображения, остановят свои контейнеры, поэтому нет ничего плохого, если некоторые узлы не смогут вытащить новую версию изображения.
UPDATE: или вы можете использовать дайджест изображений следующим образом:
docker service update --image \
$(docker inspect --type image --format '{{index .RepoDigests 0}}' username/imagename:latest) \
servicename
docker inspect --type image --format '{{index.RepoDigests 0}}' IMAGE
возвращает дайджест изображения, который включает уникальный хэш изображения, сгенерированного реестром v2. Таким образом, изображение должно быть извлечено из реестра, иначе дайджест не будет доступен.
Использование дайджеста позволяет не вытягивать изображения на всех ваших узлах (изображения с указанным дайджестом будут автоматически вытаскиваться из реестра на нужные узлы). Но перед обновлением службы вы должны вытащить новую версию изображения на узле менеджера.
BTW, последний способ будет по умолчанию, так как Docker 1.13
То, что я делаю, это
обновление докере -контейнера-label-add last_deployed = $ (дата -u +% Y-% m-% dT% H:% M:% S) имя_сервера_or_id
Если вы хотите обновить изображение docker service update --image myimage:tag servicename
, вы можете просто docker service update --image myimage:tag servicename
. например, docker service update --image traefik:1.7.5 traefik_proxy
Также, не используя myimage:latest
тег, он гарантирует, что вы не будете непреднамеренно обновлять последнюю обновленную версию major/minor вместо обновления патча.
Ссылка: https://github.com/moby/moby/issues/30951#issuecomment-279479589