是否可以使用一个具有多个路径的共享命名卷?
我想避免重复(DRY 模式),并避免为不同路径创建许多命名卷,这些卷由于业务需求(备份策略等)而必须集中。
我基于 NFS 创建了以下命名卷
vol-web
,以便与我的 swarm 集群中的许多工作人员共享。但可以在本地复制。想象一下该卷指向主机中的一个目录。
docker volume create --driver local \
--opt type=nfs \
--opt o=addr=10.0.0.2,rw \
--opt device=:/var/web \
vol-web
下面的文件仅用于测试目的,但我有很多撰写文件,许多服务将在实践中使用此解决方案。
version: '3.8'
services:
database:
image: postgres:16.2
container_name: mydb
restart: always
environment:
- POSTGRES_USER=myuser
- POSTGRES_PASSWORD=mypassword
volumes:
- vol-web/pgdata:/var/lib/postgresql/data
- vol-web/config/pg/postgres-init.sh:/docker-entrypoint-initdb.d/postgres-init.sh
ports:
- "5432:5432"
nginx:
image: nginx:1.25.4
container_name: my-nginx
ports:
- "80:80"
- "443:443"
volumes:
- vol-web/config/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- vol-web/certbot/conf:/etc/letsencrypt
volumes:
vol-web:
我实际上收到以下错误消息:
service "database" refers to undefined volume vol-web/pgdata: invalid compose project
我愿意为此案例提供新的解决方案。
对挂载卷子路径的支持仅在 Docker 26.0.0(2024 年 3 月 20 日发布)及更高版本中可用(拉取请求于 1 月合并)。这会将 subpath
选项添加到卷安装中。
docker run
,我们可以将
pgdata
卷的 vol-web
子目录挂载到 /data
上,如下所示:docker run -it --rm --mount type=volume,source=vol-web,target=/data,volume-subpath=pgdata alpine sh
docker compose
中对此功能的支持仅在几天前
合并,并且仅在
compose
插件版本2.26.0及更高版本中可用;目前 Docker 版本中似乎不提供此功能。
在上述版本之前,无法挂载卷子路径。
与您的问题无关,但很重要:当您创建这样的卷时:
docker volume create --driver local \
--opt type=nfs \
--opt o=addr=10.0.0.2,rw \
--opt device=:/var/web \
vol-web
然后在您的撰写文件中使用如下所示的卷条目:
volumes:
vol-web:
它们
不是指的是同一卷。撰写文件中的卷、网络和容器名称以您的撰写项目名称为前缀(通常是包含撰写文件的目录的名称,但也可以显式设置)。如果您希望撰写文件引用现有的外部卷,则需要将其设置为
external
:
volumes:
vol-web:
external: true