即使删除映像,Docker堆栈部署最新映像也能正常工作

时间:2018-07-08 19:45:26

标签: docker docker-swarm

我有一个docker compose文件,其中包含一个使用最新标签的容器: code_site: image: code_site:latest deploy: restart_policy: condition: any volumes: - ../../data_to_backup/code_site/drupal_sites:/drupal_www/sites - drupal_core:/drupal_www/core - php_fpm_socket:/var/run/php-fpm7 networks: - main_net

我有一个将重建容器的过程。我想对网站进行更改时使用它。

我正在调查docker stack deploy命令的问题: docker stack deploy --compose-file=docker-compose.yml code_site (堆栈名称恰好与图像名称匹配,但这是一个巧合。)

如果我经过以下过程: 删除code_site:latest图片(rmi code_site:latest) 重建一个新的code_site:latest图片 重新部署堆栈

它将弹出容器的旧版本。这很令人困惑,尤其是当我删除了旧版本时。

我走得更远,删除了code_site映像,然后运行了stack deploy命令。 堆栈成功部署后仍在运行旧版本的容器。

我可以使用docker images命令并验证是否没有名为code_site:latest的容器,所以我不知道堆栈如何部署。

任何人都可以解释图像是如何从死角中恢复过来的,以及我应该使用哪种方法永久摆脱它并迫使docker stack使用真实图像?

谢谢 罗伯特

更新1

code_site是本地生成的图像 我在一个集群上运行,但是集群中只有一个节点

1 个答案:

答案 0 :(得分:2)

Docker堆栈部署将从您的Docker注册表中提取最新映像,因为默认情况下设置了“ --resolve-image always”,因此始终解析为最新映像。如果您不希望这样运行

docker stack deploy --resolve-image never [rest of deploy command]

但是,为了使维护更容易,我建议在注册表中为映像使用版本标签,例如在代码更改推送标记为code_site:v1的新版本并部署新映像时使用code_site:v2 / version使用不带--resolve-image never的常规deploy命令。

此外,如果您打算向群集添加节点,则需要将命令更改为docker stack deploy --with-registry-auth,以允许其他节点从存储库中提取图像。

更新1

如果您100%确定docker注册表中没有名称为code_site:latest的映像,则

这应该有效

运行:

docker rm $(docker ps -aq)

docker volume  rm $(docker volume ls --format {{.ID}})

要检查是否有滞留的容器/服务:

列出现有服务

docker service ls

列出正在运行的堆栈

docker stack ls

列表 所有 容器

docker ps -aq

然后使用deploy命令重新部署

或者要在不删除旧容器/卷/图像的情况下更新服务,则可以仅更新图像,然后在不删除任何内容的情况下更新服务。

这将使用新映像更新您的服务...无需停止,删除然后更新...只需更新。

Docker服务更新命令

在生成新映像后运行:

docker service update [SERVICE NAME] --image [IMAGE NAME] --force