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.project
和 com.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