具有多个路径的一个共享命名卷

问题描述 投票:0回答:1

是否可以使用一个具有多个路径的共享命名卷?

我想避免重复(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 docker-compose docker-swarm
1个回答
0
投票

对挂载卷子路径的支持仅在 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


© www.soinside.com 2019 - 2024. All rights reserved.