【问题标题】:docker-compose running old imagedocker-compose 运行旧镜像
【发布时间】:2020-07-29 18:00:24
【问题描述】:

我遇到了 docker-compose 最令人沮丧的问题:

我将一个新图像推送到 gitlab,在服务器上运行 docker compose,然后.. 旧图像运行。

  • 我已经重启了docker
  • 我已经清理了所有东西(所有图像和所有容器)
  • 我已经完成了 docker-compose pull follow by up
  • 我已经尝试过 docker-compose --force-recreate
  • 我已擦除 /var/lib/docker/image

而且.. 我仍然得到一个带有旧图像的容器。 我什至不知道它从哪里得到图像,因为我已经用 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

所以,一个永久存储卷,就是这样。

【问题讨论】:

  • 您可以编辑问题以添加您的docker-compose.yml 文件吗?例如,您是否有覆盖图像内容的卷?
  • @DavidMaze,刚刚添加了信息
  • /app 使用命名卷会导致这种情况——命名卷的内容优先于映像中的内容,并且由于卷用于保存用户数据,因此其内容不会被修改为底层图像发生变化。您是否正在尝试以这种方式保存特定的数据单元,或者该卷的某些其他功能需求?
  • @DavidMaze 是的,该应用程序正在捕获实时数据并将其存储在文件中,然后这些文件最终会上传到存储中。所以我想我可以通过这种方式保存当天的文件,同时能够更新应用程序。我现在理解的是 /app 文件夹同时用于代码和数据,所以我想我应该使用另一个名称,对吧?

标签: docker docker-compose centos


【解决方案1】:

当你声明一个命名卷被挂载到/app时:

volumes:
  - volume-leech:/app

应用程序代码及其本地数据都存储在卷中。 Docker 无法区分这些,因此即使底层映像更新,卷中的旧代码最终也会优先。

如果您可以重新配置或重组应用程序以将其数据存储在其他位置,则可以将 Docker 设置更改为

volumes:
  - volume-leech:/app/data

然后/app中的主要代码将来自图像,并且只有数据将存储在命名卷中。

【讨论】:

  • 看到您的评论的那一刻,我意识到我什至没有意识到我对代码和临时文件使用了同一个文件夹!我一直在寻找所有错误的地方:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多