【问题标题】:Share volumes between separate docker compose files在单独的 docker compose 文件之间共享卷
【发布时间】:2019-01-05 10:37:27
【问题描述】:

我正在尝试允许nginx 在多个容器之间进行代理,同时还可以访问这些容器中的静态文件。

要在使用 docker compose 创建的容器之间共享卷,以下方法可以正常工作:

version: '3.6'

services:
  web:
    build:
      context: .
      dockerfile: ./Dockerfile
    image: webtest
    command: ./start.sh
    volumes:
      - .:/code
      - static-files:/static/teststaticfiles

  nginx:
    image: nginx:1.15.8-alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx-config:/etc/nginx/conf.d
      - static-files:/static/teststaticfiles
    depends_on:
      - web

volumes:
  static-files:

但是,我真正需要的是 nginx 撰写文件位于单独的文件中,并且位于完全不同的文件夹中。换句话说,docker compose up 命令将单独运行。我尝试了以下方法:

第一个撰写文件:

version: '3.6'

services:
  web:
    build:
      context: .
      dockerfile: ./Dockerfile
    image: webtest
    command: ./start.sh
    volumes:
      - .:/code
      - static-files:/static/teststaticfiles
    networks:
      - directorylocation-nginx_mynetwork

volumes:
  static-files:

networks:
  directorylocation-nginx_mynetwork:
    external: true

第二个撰写文件(即:nginx):

version: '3.6'

services:
  nginx:
    image: nginx:1.15.8-alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx-config:/etc/nginx/conf.d
      - static-files:/static/teststaticfiles
    networks:
      - mynetwork

volumes:
  static-files:

networks:
  mynetwork:

从可以查看站点的意义上说,上述两个文件可以正常工作。问题是静态文件在 nginx 容器中不可用。因此,该网站显示时没有任何图像等。

一个可以正常工作的解决方法found here 是将 nginx 容器静态文件卷改为如下:

- /var/lib/docker/volumes/directory_static-files/_data:/static/teststaticfiles

上面的工作正常,但它看起来“hacky”和脆弱。是否有另一种方法可以在位于不同撰写文件中的容器之间共享卷,而无需映射 /var/lib/docker/volumes 目录。

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    通过像您在问题中所做的那样分隔 2 个 docker-compose.yml 文件,实际上创建了 2 个不同的卷;这就是您在 nginx 服务的卷内看不到来自 web 服务的数据的原因,因为只有 2 个不同的卷。

    示例:假设您有以下结构:

    example/
        |- web/
            |- docker-compose.yml # your first docker compose file
        |- nginx/
            |- docker-compose.yml # your second docker compose file
    

    web 文件夹运行docker-compose up(或从example 目录运行docker-compose -f web/docker-compose.yml up)实际上将创建一个名为web_static-files 的卷(在docker-compose.yml 文件中定义的卷的名称, 前缀为该文件所在的文件夹)。

    因此,从nginx 文件夹运行docker-compose up 实际上会创建nginx_static-files,而不是根据需要重新使用web_static-files

    您可以通过在第二个 docker compose 文件 (nginx/docker-compose.yml) 中指定这是一个外部卷及其名称来使用 web/docker-compose.yml 创建的卷:

    volumes:
      static-files:
        external:
          name: web_static-files
    

    请注意,如果您不希望卷(和所有资源)以文件夹名称为前缀(默认),而是使用其他名称,您可以在docker-compose 命令中添加-p 选项:

    docker-compose \
        -f web/docker-compose.yml \
        -p abcd \
        up
    

    此命令现在将创建一个名为 abcd_static-files 的卷(您可以在第二个 docker compose 文件中使用它)。

    您还可以在自己的 docker-compose 文件中定义卷创建(如 volumes/docker-compose.yml):

    version: '3.6'
    
    volumes:
      static-files:
    

    并将此卷作为外部卷引用,名称为 volumes_static-files,在 web 和 nginx docker-compose.yml 文件中:

    volumes:
      volumes_static-files:
        external: true
    

    很遗憾,您不能在 docker compose 中设置卷名,它会自动添加前缀。如果这确实是个问题,您还可以在运行任何 docker-compose up 命令之前手动创建卷 (docker volume create static-files)(尽管我不推荐此解决方案,因为它添加了一个手动步骤,如果您在另一个环境)。

    【讨论】:

    • 很好的答案。但是,显然,docker-compose 现在可以设置不带前缀的卷名,每个:stackoverflow.com/a/59066462/1883050(不确定volume name property 需要什么版本的compose,但显然只有networks name property适用于 v3.5 及更高版本)。
    猜你喜欢
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    相关资源
    最近更新 更多