docker-compose文件属性(4)顶部元素volumes
·
卷是容器引擎实现的持久数据存储。Compose 提供了一种中立的方式,使服务能够挂载卷,并通过配置参数将它们分配到基础设施中。顶级volumes 声明允许配置具有名称的卷(命名卷),这些卷可以在多个服务中重复使用。
若要将一个卷应用于多个服务,您必须通过在“services”顶级元素内使用“volumes”属性来明确授予每个服务访问权限。该“volumes”属性还具有更复杂的语法,可提供更精细的控制。
以下示例展示了两种服务的配置情况:数据库的数据目录与另一项服务共享为一个卷(命名为“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 这两个路径,用于 backup 和 backend。
运行“docker compose up”命令时,如果指定的卷尚未存在,则会创建该卷。否则,将使用现有的卷,并且如果在“compose”之外手动删除该卷,该卷也会被重新创建。
在顶级 volumes 部分下的条目可以为空,此时 compose 会使用容器引擎的默认配置来创建卷。另外,您还可以通过以下键对其进行配置:
- driver:指定应使用哪个卷驱动程序。若该驱动程序不可用,则 Compose 会返回错误并不会部署该应用程序。
volumes:
db-data:
driver: foobar
- driver_opts:用于指定一系列以键值对形式呈现的选项,这些选项将传递给此卷所对应的驱动程序。这些选项取决于具体的驱动程序。
volumes:
example:
driver_opts:
type: "nfs"
o: "addr=10.40.0.199,nolock,soft,rw"
device: ":/docker/example"
- external:如果设置为true,说明此卷已在该平台上存在,并且其生命周期独立于应用程序的生命周期。因此,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:标签用于为卷添加元数据。可以使用数组或者字典来实现。
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
注意:此处定义的标签仅适用于命名卷。这些标签存储在卷资源中,并可通过“docker volume inspect”命令查看。它们不适用于绑定挂载,也不会改变挂载语义。
- name:为卷设置自定义名称。名称字段可用于引用包含特殊字符的卷。该名称将直接使用,且不会与堆栈名称相关联。
volumes:
db-data:
name: "my-app-data"
这样一来,就可以将此查找名称设为配置文件的一个参数,从而使得卷的模型 ID 被硬编码,而平台上的实际卷 ID 则会在部署时在运行时进行设置。
例如,如果在你的 .env 文件中存在“DATABASE_VOLUME=my_volume_001”这一条:
volumes:
db-data:
name: ${DATABASE_VOLUME}
运行docker compose up 会使用命名卷 my_volume_001
它还可以与外部属性结合使用。这意味着用于在平台上查找实际卷的名称与在 Compose 文件中引用卷的名称是分开设定的:
volumes:
db-data:
external: true
name: actual-name-of-volume
更多推荐
所有评论(0)