docker-compose 运行旧镜像

标签 docker docker-compose centos

我对 docker-compose 有过最令人沮丧的问题:
我将一个新图像推送到 gitlab,在服务器上运行 docker compose,然后......旧图像运行。

  • 我已经重启了 docker
  • 我已经清理了所有东西(所有图像和所有容器)
  • 我已经完成了 docker-compose pull 跟进
  • 我试过 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
    
    所以,一个永久存储卷,就是这样。

    最佳答案

    当您声明要在 /app 上挂载的命名卷时:

    volumes:
      - volume-leech:/app
    
    应用程序代码及其本地数据都存储在卷中。 Docker 无法区分这些,因此即使底层镜像更新,卷中的旧代码最终也会优先。
    如果您可以重新配置或重组应用程序以将其数据存储在其他位置,则可以将 Docker 设置更改为
    volumes:
      - volume-leech:/app/data
    
    然后是 /app 中的主要代码将来自图像,并且只有数据将存储在命名卷中。

    关于docker-compose 运行旧镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63159783/

    相关文章:

    linux - 在 CentOS 7 上更改 MongoDB 的默认 dbPath 时出错

    docker - 为什么 docker 说 -d 和 --rm 是运行容器的冲突选项?

    docker - 无法在 ubuntu 上使用 EFK 堆栈获取 Kubernetes 集群的日志

    docker - 无法在Docker中链接Consul和Spring Boot应用

    php - 服务器上的Nginx无法连接到docker php-fpm

    linux - centos 中的 yum 错误

    magento - rabbitmq/rabbitmq _erlang 连续运行或者每次输入命令

    docker - 如何在 Dockerfile 上运行两个命令?

    macos - CAN 所需的原始套接字无法在 MacOS 下工作 - 套接字 : Address family not supported by protocol

    symfony - docker-compose ERROR : The Compose file is invalid because: Service database has neither an image nor a build context specified. 至少一个必须是……