继承带有扩展字段的卷

Inherit volumes with extension fields


我想与来自单个 `docker-compose.yml` 文件的所有 docker 服务共享主机 `/etc/timezone` 文件。

我想,使用 extension fields 会是个好主意。 我发现 扩展字段用于继承 environment variables.

所以,我已经用 docker-compose.yml 试过了,如下所示:

x-timezone-volumes:
  &timezone-volumes
  volumes:
    - "/etc/localtime:/etc/localtime:ro"
    - "/etc/timezone:/etc/timezone:ro"

services:
  postgres-database:
    image: "postgres:12-alpine"
    hostname: PostgresContainer
    networks:
      backend-network:
    env_file:
      - backups/.env.db
    volumes:
      <<: *timezone-volumes
      - ./postgres-data:/var/lib/postgresql/data

我遇到了这个错误:

ERROR: The Compose file './docker-compose.yml' is invalid because:
services.postgres-database.volumes contains an invalid type, it should be an array

据我了解 , it is because merge key 已过时。

是不是不能用了?
还有其他继承卷的解决方案吗?

Yaml 合并 <<: 仅支持映射。由于它包含一个冒号,因此在某种程度上也被其语法所指责。

如果你有这样的对象:

x-timezone-volumes:
  &timezone-volumes
  volumes:
    - "/etc/localtime:/etc/localtime:ro"
    - "/etc/timezone:/etc/timezone:ro"

你可以这样引用:

services:
  app:
    <<: *timezone-volumes

在您的情况下,您希望将另一个项目附加到卷数组。所以这没有帮助。您最多可以引用各个字符串。

x-timezone-volumes:
  &timezone-volumes
  volumes:
    - &tz1 "/etc/localtime:/etc/localtime:ro"
    - &tz2 "/etc/timezone:/etc/timezone:ro"

然后像这样使用它:

services:
  app:
    volumes:
      - ./foo:/bar
      - *tz1
      - *tz2

您也可以混合搭配它们。使用没有额外卷的第一个版本和需要添加更多卷的第二个版本。为此,您可以设置整个对象和数组元素的锚点名称。


也就是说,还有环境变量TZ,您也可以使用它来控制容器的时区。

services:
  app:
    environment:
      TZ: UTC