碎片

使用 Compose,您可以使用内置的 YAML 功能使您的 Compose 文件更简洁高效。锚点和别名允许您创建可重用的代码块。如果您开始发现跨多个服务的常见配置,这将非常有用。拥有可重用的代码块可以最大限度地减少潜在错误。

锚点使用 `&` 符号创建。符号后面跟着一个别名。您可以稍后使用 `*` 符号来引用锚点后面的值。确保 `&` 和 `*` 字符以及后面的别名之间没有空格。

您可以在单个 Compose 文件中使用多个锚点和别名。

示例 1

volumes:
  db-data: &default-volume
    driver: default
  metrics: *default-volume

在上面的示例中,基于 `db-data` 卷创建了一个 `default-volume` 锚点。稍后,别名 `*default-volume` 会重用它来定义 `metrics` 卷。

锚点解析发生在 变量插值 之前,因此无法使用变量来设置锚点或别名。

示例 2

services:
  first:
    image: my-image:latest
    environment: &env
      - CONFIG_KEY
      - EXAMPLE_KEY
      - DEMO_VAR
  second:
    image: another-image:latest
    environment: *env

如果您有一个要在多个服务中使用的锚点,请将其与 扩展 结合使用,以使您的 Compose 文件更易于维护。

示例 3

您可能希望部分覆盖值。Compose 遵循 YAML 合并类型 中概述的规则。

在下面的示例中,`metrics` 卷规范使用别名来避免重复,但会覆盖 `name` 属性。

services:
  backend:
    image: example/database
    volumes:
      - db-data
      - metrics
volumes:
  db-data: &default-volume
    driver: default
    name: "data"
  metrics:
    <<: *default-volume
    name: "metrics"

示例 4

您还可以扩展锚点以添加其他值。

services:
  first:
    image: my-image:latest
    environment: &env
      FOO: BAR
      ZOT: QUIX
  second:
    image: another-image:latest
    environment:
      <<: *env
      YET_ANOTHER: VARIABLE

注意

YAML 合并 只适用于映射,不能与序列一起使用。

在上面的示例中,必须使用 `FOO: BAR` 映射语法声明环境变量,而序列语法 `- FOO=BAR` 仅在不涉及片段时才有效。