Docker Compose Volume在映像更改时不更新

bprjcwpo  于 2024-01-06  发布在  Docker
关注(0)|答案(1)|浏览(173)

我在使用Docker Compose时遇到了一个问题,当镜像被更改时,卷的内容不会更新。下面是我的 docker-compose.yml的简化版本:

  1. services:
  2. app:
  3. image: docker/image:66
  4. # ... other configurations ...
  5. volumes:
  6. - app:/var/www/html
  7. # ... other configurations ...
  8. webserver:
  9. image: nginx:alpine
  10. # ... other configurations ...
  11. volumes:
  12. - app:/var/www/html
  13. # ... other configurations ...
  14. volumes:
  15. app:

字符串
当我将docker/image:66更改为不同的版本,然后运行docker-compose up -d时,问题就出现了。卷(app:/var/www/html)的内容没有反映新镜像的更改。
我知道卷是缓存的,停止容器并手动删除镜像可以解决这个问题。但是,我相信应该有一种更有效的方法来处理这个问题,而无需手动干预。
我已经尝试为每个服务分离卷,并使用带有外部驱动程序的命名卷,但问题仍然存在。是否有推荐的方法来确保卷在映像更改时自动更新,而无需手动步骤?
任何见解或建议将不胜感激。

rdrgkggo

rdrgkggo1#

完全删除volumes:
volumes:挂载总是用命名卷的内容替换镜像的内容。除了第一次使用时的一个例外,没有任何东西会复制到命名卷中。正如你在这里看到的,卷不是从一个容器到另一个容器共享内容的可靠路径。
在你的代理容器中,我建议你构建一个单独的镜像,里面内置了你需要提供服务的任何静态资产。最重要的是你是否可以将静态文件服务委托给应用程序容器,所以你可能需要一个带有proxy_pass行的Nginx配置,但根本不需要应用程序特定的文件。如果你的应用程序框架不支持静态文件服务,那么你可以构建一个简单的镜像

  1. FROM nginx
  2. ARG app_image=docker/image
  3. COPY --from=${app_image} /var/www/html/ /var/www/html/

字符串
在Compose文件中,您可以使用变量替换来避免重复图像标记。

  1. services:
  2. app:
  3. image: docker/image:${IMAGE_TAG:-latest}
  4. webserver:
  5. # if your CI system builds both images
  6. image: docker/proxy:${IMAGE_TAG:-latest}
  7. # if you need to build it yourself
  8. build:
  9. context: .
  10. args:
  11. app_image: docker/image:${IMAGE_TAG:-latest}

展开查看全部

相关问题