lon*_*day 36 docker docker-swarm
环境
有没有办法强制滚动更新到已经运行的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)
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
您可以使用图像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以来,最后一种方式将是默认的
如果要更新 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
| 归档时间: |
|
| 查看次数: |
28158 次 |
| 最近记录: |