Docker Swarm Service – 强制更新已经运行的最新映像

环境

  • docker工1.12
  • 在Ubuntu 16.04上closures

如果服务更新没有更改任何参数,但是docker中心镜像已经更新,是否有办法强制滚动更新到已经运行的docker群服务?

例如:我部署了服务:

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

我的构build过程已经更新了Docker Hub上的最新映像,现在我想再次获取最新版本。

我试过跑步了:

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

当我遵循这个过程时,docker并没有拖动最新的,我想这个假设是因为我想要最新的并且docker已经拉出了一个图像:最新那么就没有什么可做的了。

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

仅供将来参考:

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

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

使用它在:

 docker service update --force service_name 

Docker不会自动从DockerHub(或私有registry)中为您的本地已经拥有的image:标签执行pull操作。

如果在docker service update之前执行了手动拉取,或者在本地删除了图像,则会执行此操作。

你也可以链接命令:

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

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

我做的是

  1. 先拉图像
  2. 使用新的时间戳标签运行update命令

docker service update –container-label-add last_deployed = $(date -u +%Y-%m-%dT%H:%M:%S)container_name

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

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

但在这种情况下, 在更新服务之前,所有节点都必须提取此映像。 否则,容器将仅在具有这种ID的图像存在的那些节点上被更新。 幸运的是,没有这个图像的节点将停止它们的容器,所以如果一些节点将无法拉出新版本的图像,没有什么不好的。

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

 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返回图像摘要,其中包含由registryv2生成的图像的唯一哈希值。 因此,图像必须从registry中提取,否则摘要将不可用。

使用摘要可以使您不会在所有节点上拉出图像(具有指定摘要的图像将自动从registry中的必要节点上拉出)。 但是,在服务更新之前,您必须在经理节点上一次性提取新版本的图像。

顺便说一句, 从Docker 1.13开始 ,最后一种方法将是默认的