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



我有一个 docker 撰写文件,其中包含一个使用最新标签的容器: 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 --compose-file=docker-compose.yml code_site (堆栈名称恰好与映像名称匹配,但这是巧合。

如果我经历以下过程: 删除code_site:最新映像(RMI code_site:最新( 重建新code_site:最新映像 重新部署堆栈

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

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

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

谁能解释一下镜像是如何死而复生的,以及我应该使用什么方法来永久摆脱它并强制 docker 堆栈使用真实镜像?

谢谢 罗伯特

更新 1

code_site是本地构建的映像 我在群中运行,但群中只有一个节点

Docker 堆栈部署将从 docker 注册表中提取最新映像,因为默认情况下设置了"--resolve-image always",因此始终解析为最新映像。 如果您不想运行此内容

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

但是,为了更轻松地维护更改,我建议在注册表中对映像使用版本标记,例如code_site:v1当代码更改推送标记为code_site:v2的新版本并使用常规部署命令部署新映像/版本而不--resolve-image never

此外,如果您计划将节点添加到群中,则需要将命令更改为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

然后使用部署命令重新部署

或者,要在不删除旧容器/卷/映像的情况下更新服务,只需更新映像,然后更新服务而不删除任何内容。

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

码头工人服务更新命令

生成新映像后运行:

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

最新更新