如何更新我的 docker service/stack 使用的最新图像?

How can I update the latest image that my docker service/stack uses?

.yml 定义中,我总是拉取我服务的 latest 图像。

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

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

真的 不应该在生产中使用 latest 或本地机器 testing/learning 以外的任何东西。它使您使用的图像变得模棱两可,并且您无法在 docker service ls/ps 中判断它是否默认为当前以及各种其他模棱两可(例如 SHA 在 Docker Hub 的 GUI 中不可见).

如果您没有办法绕过它,至少 Swarm 会尝试 查询您的注册表并检查更新的 SHA。如果它看到带有 docker service update --image <username>/<repo> <servicename> 的一个,那么它将拉取并进行滚动更新。您可以观看 docker events 以确保事情正在发生,您可以使用 docker service ps --no-trunc <servicename> 事后检查并查看新旧图像的 SHA 哈希值。

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

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

在测试时,我发现它甚至可以在需要时拉取最新的图像。

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

如果您使用组合文件来部署服务。我不推荐使用这个命令:

docker service update --image <username>/<repo> <servicename>    

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

docker stack up -c </path/to/compose.yml> <servicename>

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