我试图允许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
目录。
答案 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
)(我不建议您使用此解决方案,因为它添加了一个手动步骤,如果您忘记了在另一个环境中复制您的部署)。