合并嵌套的 Yaml 数组

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 配置来解决这个问题

基于键的反向深度合并