Volumes 顶级元素

卷是由容器引擎实现的持久数据存储。Compose 提供了一种中立的方式让服务挂载卷,并通过配置参数将它们分配到基础设施中。顶层的 volumes 声明允许你配置可以在多个服务中重复使用的命名卷。

要在多个服务中使用卷,您必须通过在services顶级元素中使用volumes属性显式授予每个服务访问权限。volumes属性具有提供更细粒度控制的附加语法。

提示

正在处理大型仓库或单体仓库,或者虚拟文件系统不再与您的代码库同步扩展? Compose 现在利用 同步文件共享 并自动为绑定挂载创建文件共享。 确保您已使用付费订阅登录 Docker,并在 Docker Desktop 的设置中启用了 访问实验性功能使用 Compose 管理同步文件共享

示例

以下示例展示了一个双服务设置,其中数据库的数据目录与另一个服务共享为一个卷,名为 db-data,以便可以定期备份。

services:
  backend:
    image: example/database
    volumes:
      - db-data:/etc/data

  backup:
    image: backup-service
    volumes:
      - db-data:/var/lib/backup/data

volumes:
  db-data:

db-data 卷被挂载在容器的 /var/lib/backup/data/etc/data 路径上,分别用于备份和后端。

运行 docker compose up 如果卷不存在则会创建它。否则,将使用现有卷,并且如果在 Compose 之外手动删除它,则会重新创建。

属性

在顶级volumes部分下的条目可以为空,在这种情况下,它使用容器引擎的默认配置来创建卷。可选地,您可以使用以下键进行配置:

driver

指定应使用哪个卷驱动程序。如果驱动程序不可用,Compose 将返回错误并且不会部署应用程序。

volumes:
  db-data:
    driver: foobar

driver_opts

driver_opts 指定了一组键值对选项,用于传递给此卷的驱动程序。这些选项取决于驱动程序。

volumes:
  example:
    driver_opts:
      type: "nfs"
      o: "addr=10.40.0.199,nolock,soft,rw"
      device: ":/docker/example"

external

如果设置为 true:

  • external 指定此卷已存在于平台上,并且其生命周期由应用程序之外管理。如果卷不存在,Compose 不会创建卷并返回错误。
  • 除了name之外的所有其他属性都是无关紧要的。如果Compose检测到任何其他属性,它会将Compose文件视为无效。

在下面的示例中,Compose 不是尝试创建一个名为 {project_name}_db-data 的卷,而是寻找一个已经存在的名为 db-data 的卷,并将其挂载到 backend 服务的容器中。

services:
  backend:
    image: example/database
    volumes:
      - db-data:/etc/data

volumes:
  db-data:
    external: true

标签

labels 用于向卷添加元数据。您可以使用数组或字典。

建议您使用反向DNS表示法,以防止您的标签与其他软件使用的标签发生冲突。

volumes:
  db-data:
    labels:
      com.example.description: "Database volume"
      com.example.department: "IT/Ops"
      com.example.label-with-empty-value: ""
volumes:
  db-data:
    labels:
      - "com.example.description=Database volume"
      - "com.example.department=IT/Ops"
      - "com.example.label-with-empty-value"

Compose 设置 com.docker.compose.projectcom.docker.compose.volume 标签。

name

name 为卷设置自定义名称。名称字段可用于引用包含特殊字符的卷。名称按原样使用,不与堆栈名称范围绑定。

volumes:
  db-data:
    name: "my-app-data"

这使得可以将此查找名称作为Compose文件的参数,以便卷的模型ID是硬编码的,但平台上的实际卷ID在部署期间运行时设置。

例如,如果DATABASE_VOLUME=my_volume_001在你的.env文件中:

volumes:
  db-data:
    name: ${DATABASE_VOLUME}

运行 docker compose up 使用名为 my_volume_001 的卷。

它也可以与external属性一起使用。这意味着用于在平台上查找实际卷的名称与在Compose文件中引用卷的名称是分开设置的:

volumes:
  db-data:
    external: true
    name: actual-name-of-volume