在单独的docker compose文件之间共享卷
我试图允许在多个容器之间进行代理,同时也从这些容器访问静态文件 要在使用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
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和nginxdocker 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