在单独的Docker撰写文件之间共享卷

时间:2019-01-05 10:37:27

标签: docker docker-compose

我试图允许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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

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

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

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:

并在Web和Nginx volumes_static-files文件中将此卷作为外部卷(名称为docker-compose.yml)引用:

volumes:
  static-files:
    external:
      name: volumes_static-files

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