Docker Swarm服务 - 强制更新已运行的最新映像

lon*_*day 36 docker docker-swarm

环境

  • 码头工人1.12
  • 在Ubuntu 16.04上使用了

有没有办法强制滚动更新到已经运行的docker swarm服务,如果服务更新没有更改任何参数但Docker hub映像已更新?

示例:我部署了服务:

docker service create --replicas 1 --name servicename --publish 80:80 username/imagename:latest
Run Code Online (Sandbox Code Playgroud)

我的构建过程已更新了docker hub上的最新映像,现在我想再次提取最新版本.

我试过跑:

docker service update --image username/imagename:latest servicename
Run Code Online (Sandbox Code Playgroud)

当我按照这个过程,docker没有拉最新的,我想它假设因为我想最新和docker已经拉了一个图像:最新然后没有什么可做的.

我唯一的工作是删除服务servicename并重新部署.

Ais*_*amu 33

仅供将来参考:

Docker 1.13添加了一个--force标志service update:

--force:即使没有更改需要,也强制更新

使用方式如下:

docker service update --force service_name
Run Code Online (Sandbox Code Playgroud)

  • 我在Azure上使用Docker Swarm(17.04.0-ce),只使用`--force`不会将映像更新到最新版本.我必须将摘要添加到图像标记:`docker service update --image registry.co/image:latest@sha256:109ca ... service`.然后它将图像更新为最新推送.我错过了吗? (6认同)
  • IIRC,如果您的服务设置为使用特定摘要,更新它将继续拉动相同的图像.您可以尝试`docker service update --force --image registry.co/image service`来删除摘要固定,从那时起,单个`--force`就可以了. (4认同)
  • 感谢您的答复!我做了一些繁重的测试,但使用--force标志没有运气。我尝试了一个私有的Docker Registry(使用`registry:2`)和der官方的Docker Hub(认为注册表可能是原因)。在更新期间,我从未指定过任何摘要(在service create或service update上),但是Docker始终使用摘要。“服务检查”还显示了摘要,并且自动回滚也对其进行了考虑。也许这是预期的行为(已在`17.05.0-ce,build 89658be'上测试)? (3认同)

Dev*_*Dan 15

Docker不会自动从DockerHub(或私有注册表)执行对您已在本地拥有的图像:标记的提取.

如果您在之前执行了手动拉动docker service update,或者在本地删除了图像,则会.

你也可以链接命令:

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

您可以通过以数字方式标记图像并使用更新的标记来避免这种情况. username/imagename:1.1.0

  • 我能够通过利用容器标签触发滚动更新.我添加了--container-label-add deploy ="1.0.1".因此,每次更改标签时,每个服务都会对服务进行拉取和重新部署. (8认同)

ren*_*kiy 8

您可以使用图像ID而不是username/imagename:latest像这样:

docker service update --image \
$(docker inspect --type image --format '{{.Id}}' username/imagename:latest) \
servicename
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,所有节点必须在服务更新之前提取此图像.否则,只会在存在具有此ID的图像的节点上更新容器.幸运的是,没有此映像的节点将停止其容器,因此如果某些节点无法提取新版本的映像,则没有什么不妥.

更新:或者你可以使用图片摘要如下:

docker service update --image \
$(docker inspect --type image --format '{{index .RepoDigests 0}}' username/imagename:latest) \
servicename
Run Code Online (Sandbox Code Playgroud)

docker inspect --type image --format '{{index .RepoDigests 0}}' IMAGE返回图像摘要,其中包括由注册表v2生成的图像的唯一哈希.因此,必须从注册表中提取图像,否则将无法使用摘要.

使用摘要允许您不在所有节点上提取图像(具有指定摘要的图像将自动从必要节点上的注册表中提取).但是,在服务更新之前,您必须在管理器节点上提取一次新版本的映像.

BTW,自Docker 1.13以来,最后一种方式将是默认的


Pra*_*tik 5

如果要更新 docker 服务映像,只需执行docker service update --image myimage:tag servicename. 例如docker service update --image traefik:1.7.5 traefik_proxy也通过不使用myimage:latest标签,它可以确保您不会无意中更新到最新更新的主要/次要版本而不是补丁版本。

参考:https : //github.com/moby/moby/issues/30951#issuecomment-279479589