sco*_*ott 3 arrays dictionary yaml docker-compose
这是 Ben 帖子的后续内容,有 YAML 语法用于共享列表或地图的一部分,尽管我在合并两个数组后更进一步并第三次继承。
我正在创建一个docker-compose.yml文件并想要做锚点和别名
x-template:
base-template: &base-template
environemt:
FOO=BAR
custom-template-1: &custom-template1
<<: *base-template
environment+:
FOO2=BAR2
services:
service-1:
<<: *custom-template1
Run Code Online (Sandbox Code Playgroud)
但我得到了错误
Unsupported config option for services.service-1: 'environment+'
Run Code Online (Sandbox Code Playgroud)
如果我不使用environment+:的custom-tamplate-1:,如果我定义级别,或者environment+:在service-1:它工作的水平。
我希望结果是
services:
service-1:
environment:
FOO:BAR
FOO2:BAR2
Run Code Online (Sandbox Code Playgroud)
有可能实现我想要的吗?
mic*_*sna 13
TL;DR:不,这是不可能的
首先,你的docker-compose有错别字,下次请复制整个docker-compose。这是我的更正(我不想编辑您的问题)并扩展为可测试:
version: '2.4'
x-base-template: &base-template
image: alpine
command: env
environment:
- FOO=BAR
x-custom-template-1: &custom-template1
<<: *base-template
environment:
- FOO2=BAR2
services:
service-1:
<<: *custom-template1
Run Code Online (Sandbox Code Playgroud)
这个设置将完全覆盖环境设置,所以只FOO2设置了,我想这就是你问的原因。
我不知道你从哪里+找到了 plus语法,但我找不到任何关于它的信息。我找到的唯一地方+是在https://yaml.org/refcard.html,但根本没有提到数组。那是针对字符串的。
您根本无法合并数组,但您可以使用key: value环境语法,并且可以通过以下方式合并:
version: '2.4'
x-base-environment: &base-environment
FOO: BAR
x-base-template: &base-template
image: alpine
command: env
environment: *base-environment # This is only necessary if you want variables in base-template
x-custom-template-1: &custom-template1
<<: *base-template
environment:
<<: *base-environment
FOO2: BAR2
services:
service-1:
<<: *custom-template1
Run Code Online (Sandbox Code Playgroud)
我们正在使用的合并,即Merge Key Language-Independent Type,不支持嵌套合并。这意味着密钥要么从一个对象中选取,要么从另一个对象中选取,没有组合。这是有意设计的,大多数时候都是良好的行为。可悲的是,没有支持嵌套合并的 yaml 功能(任何我知道的),所以对您的问题的简单回答是“不,这是不可能的”
旁注:GitLab 试图通过其专有的extends支持CI 配置来解决这个问题
基于键的反向深度合并