Docker Swarm Service - принудительное обновление последнего изображения уже запущено

окружающая среда

  • докер 1.12
  • clusted on Ubuntu 16.04

Есть ли способ заставить скользящее обновление уже запущенной службы старта докеров, если обновление службы не меняет никаких параметров, но изображение узла-докеры обновлено?

Пример: я развернул службу:

docker service create --replicas 1 --name servicename --publish 80:80 username/imagename:latest

Мой процесс сборки обновил последнее изображение на докере-концентраторе, теперь я хочу снова вытащить последнее.

Я пробовал работать:

docker service update --image username/imagename:latest servicename

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

Единственная работа, с которой я работаю, - удалить служебное имя сервиса и перераспределить.

Ответы

Ответ 1

Только для справок в будущем:

Docker 1.13 добавил флаг --force в service update:

--force: принудительно обновлять, даже если никаких изменений не требуется

Используйте его как в:

docker service update --force service_name

Ответ 2

Docker не будет автоматически выполнять откат от DockerHub (или частного реестра) для изображения: тег, который у вас уже есть локально.

Если вы выполнили ручное нажатие до docker service update или удалили изображение локально, это будет.

Вы также можете связать команду:

docker pull image:tag && docker service update --image username/imagename:latest servicename

Вы можете избежать этого сценария, пометив ваши изображения численно и используя обновленный тег. username/imagename:1.1.0

Ответ 3

Вы можете использовать идентификатор изображения вместо имени 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

Ответ 4

То, что я делаю, это

  1. сначала вытащить изображение
  2. Запустите команду update с новой меткой метки времени

обновление докере -контейнера-label-add last_deployed = $ (дата -u +% Y-% m-% dT% H:% M:% S) имя_сервера_or_id

Ответ 5

Если вы хотите обновить изображение 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