Volumes 顶级元素

卷(Volumes)是由容器引擎实现的持久化数据存储。Compose 提供了一种服务挂载卷的通用方式,以及将卷分配给基础设施的配置参数。顶级 volumes 声明允许您配置可在多个服务中重复使用的命名卷。

要在多个服务中使用卷,您必须使用 services 顶级元素中的 volumes 属性显式地授予每个服务访问权限。volumes 属性有额外的语法,可提供更精细的控制。

提示

正在使用大型仓库或单体仓库,或者遇到无法随代码库扩展的虚拟文件系统?Compose 现在利用了同步文件共享功能,并为绑定挂载自动创建文件共享。请确保您已使用付费订阅登录 Docker,并在 Docker Desktop 的设置中启用了 访问实验性功能(Access experimental features)使用 Compose 管理同步文件共享(Manage Synchronized file shares with 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 卷分别挂载到 backup 服务的 /var/lib/backup/data 容器路径和 backend 服务的 /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

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 为卷设置自定义名称。name 字段可用于引用包含特殊字符的卷。该名称按原样使用,不受堆栈名称的范围限制。

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

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

例如,如果您的 .env 文件中包含 DATABASE_VOLUME=my_volume_001

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

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

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

volumes:
  db-data:
    external: true
    name: actual-name-of-volume
页面选项