我对 docker-compose 有过最令人沮丧的问题:
我将一个新图像推送到 gitlab,在服务器上运行 docker compose,然后......旧图像运行。
和..我仍然得到一个带有旧图像的容器。
我什至不知道它从哪里得到图像,因为我已经用 docker rmi 删除了它们......
现在,如果我执行 docker run gitlabimagepath,新图像将正常运行。
因此,在同一台计算机上,问题具体发生在 docker-compose 上,而不是 docker 上。
docker-compose pull 正在获取具有正确摘要的图像。
当我使用 docker-compose 运行它并获取旧图像时,或者我使用 docker run 运行时,检查会给出相同的图像 sha256。所以看起来有一些旧容器不断为 docker-compose 复活并且永远不会被重建
我想不出比“这到底是什么?”更好的问题了。
这个类似的问题没有任何内容docker-compose keeps using old image content完全有帮助。
docker compose 非常基础:
version: '3.3'
services:
leech:
container_name: services_leech
image: registry.gitlab.com/...:latest
restart: unless-stopped
volumes:
- volume-leech:/app
networks:
- default
volumes:
volume-leech:
networks:
default:
external:
name: leech-network
所以,一个永久存储卷,就是这样。
最佳答案
当您声明要在 /app
上挂载的命名卷时:
volumes:
- volume-leech:/app
应用程序代码及其本地数据都存储在卷中。 Docker 无法区分这些,因此即使底层镜像更新,卷中的旧代码最终也会优先。如果您可以重新配置或重组应用程序以将其数据存储在其他位置,则可以将 Docker 设置更改为
volumes:
- volume-leech:/app/data
然后是 /app
中的主要代码将来自图像,并且只有数据将存储在命名卷中。
关于docker-compose 运行旧镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63159783/