如何在两个服务之间共享 docker 音量,其中一个是真实来源?

How to share docker volume between two services with one being the source of truth?

我的 docker-compose 中有两个服务:

version: '3.9'
services:
  web:
    build:
      context: .
    ports:
      - 8080:8080
    links:
      - php
    volumes:
      - "html:/usr/share/nginx/html/"
  php:
    env_file:
      - ".env"
    image: php:7-fpm
    volumes:
      - "html:/usr/share/nginx/html/"

volumes:
  html:

和一个 Dockerfile:

FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY public_html/* /usr/share/nginx/html/

但是当我 运行 docker-compose up --build 它不更新卷中的文件。我必须删除 public_html 中文件的卷才能更新这两项服务。

docker-compose 中的 volumes 优先于您在 Dockerfile 中添加的文件。

这些容器不会获取您尝试添加到 Dockerfile 中的内容 - 它们会从您主机中的 html 卷中获取内容。

这是两种不同的技术 - 安装卷与将文件添加到 Dockerfile 中的图像。

一个不使用 volumes 的解决方案可能是每次都构建两个图像:

PhpDockerfile内容:

FROM php:7-fpm
COPY public_html/* /usr/share/nginx/html/

docker-compose.yml:

version: '3.9'
services:
  web:
    build:
      context: .
    ports:
      - 8080:8080
    links:
      - php
  php:
    env_file:
      - ".env"
    build:
      context: .
      dockerfile: PhpDockerfile

编辑: 第二种方法,使用卷而不是在 dockerfile 中添加它们(会更快,因为您不必每次都构建,更适合开发环境):

version: '3.9'
services:
  web:
    build:
      context: .
    ports:
      - 8080:8080
    links:
      - php
    volumes:
      - "./public_html/:/usr/share/nginx/html/"
  php:
    env_file:
      - ".env"
    image: php:7-fpm
    volumes:
      - "./public_html/:/usr/share/nginx/html/"

然后你可以删除

COPY public_html/* /usr/share/nginx/html/

来自你的 dockerfile。 请注意,您可能需要在 docker-compose 文件中使用完整路径而不是相对路径。