gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:23:28 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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:

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

不幸的是,您不能在 docker compose 中设置卷名称,它会自动加上前缀。如果这确实是一个问题,您还可以在运行任何 docker volume create static-files 之前手动创建卷( docker-compose up )命令(虽然我不推荐此解决方案,因为它添加了一个手动步骤,如果您在另一个环境中重现部署,则可能会忘记该步骤)。

关于docker - 在单独的 docker compose 文件之间共享卷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54051130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com