在单独的docker compose文件之间共享卷

在单独的docker compose文件之间共享卷,docker,docker-compose,Docker,Docker Compose,我试图允许在多个容器之间进行代理,同时也从这些容器访问静态文件 要在使用docker compose创建的容器之间共享卷,请正确执行以下操作: version: '3.6' services: web: build: context: . dockerfile: ./Dockerfile image: webtest command: ./start.sh volumes: - .:/code - static

我试图允许在多个容器之间进行代理,同时也从这些容器访问静态文件

要在使用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 compose文件位于一个单独的文件中,并且位于一个完全不同的文件夹中。换句话说,
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):

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

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

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

上述方法是正确的,但它看起来“粗糙”且脆弱。是否有另一种方法可以在存放在不同组合文件中的容器之间共享卷,而无需映射
/var/lib/docker/volumes
目录。

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

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

example/
    |- web/
        |- docker-compose.yml # your first docker compose file
    |- nginx/
        |- docker-compose.yml # your second docker compose file
web
文件夹运行
docker compose up
(或从
示例
目录运行
docker compose-f web/docker-compose.yml up
实际上会创建一个名为
web\u static-files
(在
docker compose.yml
文件中定义的卷的名称,以该文件所在的文件夹为前缀)

因此,从
nginx
文件夹运行
docker compose up
,实际上将创建
nginx\u静态文件
,而不是像您希望的那样重复使用
web\u静态文件

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

volumes:
  static-files:
    external:
      name: web_static-files
请注意,如果不希望卷(和所有资源)以文件夹名称(默认)作为前缀,而希望以其他名称作为前缀,则可以将
-p
选项添加到
docker compose
命令:

docker-compose \
    -f web/docker-compose.yml \
    -p abcd \
    up
此命令现在将创建一个名为
的卷du_static-files
(可在第二个docker compose文件中使用)

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

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

volumes:
  volumes_static-files:
    external: true

很遗憾,您无法在docker compose中设置卷名,卷名将自动加前缀。如果这确实是一个问题,您也可以在运行任何
docker compose up
命令之前手动创建卷(
docker volume create static files
)(但我不建议使用此解决方案,因为它添加了一个手动步骤,如果在另一个环境中复制部署,可能会忘记该步骤)。

回答得很好。不过,显然,docker compose现在可以设置一个没有前缀的卷名,per:stackoverflow.com/a/59066462/1883050(不确定
卷名属性
需要什么版本的compose,但显然
网络名属性
仅适用于v3.5及以上版本)。
version: '3.6'

volumes:
  static-files:
volumes:
  volumes_static-files:
    external: true