卷顶级元素

卷是由容器引擎实现的持久性数据存储。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)

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