YAML中隐藏的可重复使用的块

时间:2017-07-04 11:41:05

标签: yaml docker-compose

我试图在docker-compose.yml文件中定义一个可重用块,其方式是可重用块定义本身不包含在最终(已评估)YAML中。

我知道如何使用以下语法定义可重用块:

services:
  default: &default
    image: some/image

  dashboard:
    <<: *default
    command: run dashboard
    ports: ["3000:3000"]

但是,上面还会在服务下创建一个名为default的条目,我想避免这样做。换句话说,我需要最终的YAML结果才能在dashboard属性下包含services

YAML可以吗?我无法找到足够清楚地讨论这种结构的参考文献。

直观地说,我尝试了下面的一些变体,但它也没有用。

services:
  &default:
    image: some/image

  dashboard:
    <<: *default
    command: run dashboard
    ports: ["3000:3000"]

2 个答案:

答案 0 :(得分:4)

这在YAML 1.2(或任何以前的版本)中是不可能的。这背后的原因是YAML被设计为序列化语言,而不是配置语言。

Anchor / Alias构造很适合序列化循环数据结构。它从未打算用于声明将在多个地方使用的变量。所以目前,创建一个可以在多个地方使用的可重用结构的唯一方法就是在第一个地方定义结构。例如:

services:
  dashboard:
    <<: &default
      image: some/image
    command: run dashboard
    ports: ["3000:3000"]
  some_other_service:
    <<: *default
    other_props: ...

另外,请注意,合并键<<不是YAML规范的一部分,仅定义为YAML 1.1的附加功能。它没有为YAML 1.2定义,并且将针对即将推出的YAML 1.3明确弃用。

我们(如:正在处理YAML 1.3的人员)知道这个缺失的功能,并计划使用YAML 1.3提供更好的解决方案。

答案 1 :(得分:1)

Docker Compose文件格式3.4增加了对扩展字段的支持:Docker Compose和Docker引擎会忽略以x-开头的顶级密钥。

例如:

version: '3.4'
x-default: &default
  image: some/image
services:
  dashboard:
    <<: *default
    command: run dashboard
    ports: ["3000:3000"]

资料来源:“在Docker撰写文件中不要使用锚,别名和扩展名重复自己”,作者:黄重中https://link.medium.com/N5DFdiC3F0