如何更新docker服务/堆栈使用的最新映像?

Chr*_*sco 5 docker docker-swarm docker-stack portainer

.yml定义中,我一直在拉latest我的服务形象。

当我将新映像推送到注册表时,我想更新堆栈中的服务使用的映像。我没有看到任何--pull标志,并且docker服务更新的文档中没有明确提及这一点。

如何使用最近推送的latest图像重新部署?

Sco*_*tow 6

要添加Bret Fisher的答案,docker stack deploy -c compose-file.yml使用相同的compose-file.yml文件运行,并将图像标记为latest确实会比较图像的 SHA,并在需要时重新部署相应服务的图像。

这要归功于--resolve-imageDocker 17.09 中添加的标志,默认为always.

在测试它时,我发现如果需要的话它甚至会拉取最新的图像。

相关 GitHub 问题:https://github.com/moby/moby/issues/30951#issuecomment-342647614


Bre*_*her 5

真的不应该latest在生产中使用或在本地机器测试/学习之外使用任何东西。对于要使用的映像,这一切都变得模棱两可,而且您无法分辨docker service ls/ps默认情况下它是否是当前映像以及其他各种歧义(例如,在Docker Hub的GUI中看不到SHA)。

如果您无法解决,至少Swarm会尝试查询您的注册表并检查更新的SHA。如果看到一个,docker service update --image <username>/<repo> <servicename>则它将拉动并进行滚动更新。您可以观察docker events确定正在发生的事情,还可以docker service ps --no-trunc <servicename>用来事后检查并查看新旧图像的SHA哈希值。

  • 仅供参考,最新版本的Portainer(1.18.0)使您能够通过单击来更新服务,并强制使用新的图像摘要分辨率(这将更新与服务关联的图像)。 (2认同)

D.F*_*itz 5

如果您使用撰写文件来部署服务。我不建议使用此命令:

docker service update --image <username>/<repo> <servicename>    
Run Code Online (Sandbox Code Playgroud)

这会导致您的文件过时并且不再是您的服务配置的记录来源。相反,按照 Bret Fisher 的建议,使用特定图像版本更新您的撰写文件,然后运行以下命令:

docker stack up -c </path/to/compose.yml> <servicename>
Run Code Online (Sandbox Code Playgroud)

如果其他人也在管理群体,保持有效记录很重要。

  • 我会在 compose 的“更新配置”部分下尝试“先启动”顺序。https://docs.docker.com/compose/compose-file/#update_config (2认同)