Docker stack deploy latest image 即使在删除图像时也能正常工作
Docker stack deploy latest image works even when image is deleted
我有一个 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 命令的问题:
docker stack deploy --compose-file=docker-compose.yml code_site
(堆栈名称恰好与图像名称匹配,但这是巧合。)
如果我经历以下过程:
删除 code_site:latest 图像 (rmi code_site:latest)
重建一个新的 code_site:latest 图像
重新部署堆栈
它将调出容器的旧版本。这令人困惑,尤其是因为我删除了旧版本。
我更进一步,我删除了 code_site 图像,然后 运行 堆栈部署命令。
堆栈仍然成功部署 运行 旧版本的容器。
我可以使用 docker images 命令并验证没有名为 code_site:latest 的容器,所以我不知道如何部署堆栈。
谁能解释图像是如何死而复生的,我应该使用什么方法永久摆脱它并强制 docker 堆栈使用真实图像?
谢谢
罗伯特
更新 1
code_site是本地构建的镜像
我 运行 在一个群中,但群中只有一个节点
Docker stack deploy 将从您的 docker 注册表中提取最新图像,因为默认情况下设置了“--resolve-image always”,因此始终解析为最新图像。如果你不想要这个 运行
docker stack deploy --resolve-image never [rest of deploy command]
但是,为了更容易维护更改,我建议在您的注册表中为您的图像使用版本标签,例如 code_site:v1
当代码更改推送标记为 code_site:v2
的新版本并部署新 image/version 使用没有 --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}})
检查挥之不去containers/services:
列出现有服务
docker service ls
列表运行宁栈
docker stack ls
列表 全部 容器
docker ps -aq
然后使用部署命令重新部署
或者在不删除旧 containers/volumes/images 的情况下更新您的服务,您可以只更新您的图像,然后在不删除任何内容的情况下更新您的服务。
这将使用新映像更新您的服务...无需停止、删除然后更新...只需更新即可。
Docker 服务更新命令
运行 新镜像构建后:
docker service update [SERVICE NAME] --image [IMAGE NAME] --force
我有一个 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 命令的问题:
docker stack deploy --compose-file=docker-compose.yml code_site
(堆栈名称恰好与图像名称匹配,但这是巧合。)
如果我经历以下过程: 删除 code_site:latest 图像 (rmi code_site:latest) 重建一个新的 code_site:latest 图像 重新部署堆栈
它将调出容器的旧版本。这令人困惑,尤其是因为我删除了旧版本。
我更进一步,我删除了 code_site 图像,然后 运行 堆栈部署命令。 堆栈仍然成功部署 运行 旧版本的容器。
我可以使用 docker images 命令并验证没有名为 code_site:latest 的容器,所以我不知道如何部署堆栈。
谁能解释图像是如何死而复生的,我应该使用什么方法永久摆脱它并强制 docker 堆栈使用真实图像?
谢谢 罗伯特
更新 1
code_site是本地构建的镜像 我 运行 在一个群中,但群中只有一个节点
Docker stack deploy 将从您的 docker 注册表中提取最新图像,因为默认情况下设置了“--resolve-image always”,因此始终解析为最新图像。如果你不想要这个 运行
docker stack deploy --resolve-image never [rest of deploy command]
但是,为了更容易维护更改,我建议在您的注册表中为您的图像使用版本标签,例如 code_site:v1
当代码更改推送标记为 code_site:v2
的新版本并部署新 image/version 使用没有 --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}})
检查挥之不去containers/services:
列出现有服务
docker service ls
列表运行宁栈
docker stack ls
列表 全部 容器
docker ps -aq
然后使用部署命令重新部署
或者在不删除旧 containers/volumes/images 的情况下更新您的服务,您可以只更新您的图像,然后在不删除任何内容的情况下更新您的服务。
这将使用新映像更新您的服务...无需停止、删除然后更新...只需更新即可。
Docker 服务更新命令
运行 新镜像构建后:
docker service update [SERVICE NAME] --image [IMAGE NAME] --force