我试图在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"]
答案 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