Слияние вложенных Yaml-массивов - PullRequest
0 голосов
/ 29 декабря 2018

Это что-то вроде продолжения поста Бена есть ли синтаксис 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

, но я получаю ошибку

Unsupported config option for services.service-1: 'environment+'

Если я это сделаюне используйте environment+: на уровне custom-tamplate-1:, или, если я определю environment+: на уровне service-1:, это сработает.

Я бы хотел, чтобы результат был

services:
  service-1:
    environment:
      FOO:BAR
      FOO2:BAR2

можно ли добиться того, чего я хочу?

1 Ответ

0 голосов
/ 02 января 2019

TL; DR: Нет, это невозможно


Прежде всего, у вас есть опечатки в вашем наборе докеров, пожалуйста, скопируйте весь докер-сочиняй в следующий раз.Вот мой исправленный (я не хотел редактировать ваш вопрос) и расширенный для тестирования:

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

Эта настройка полностью переопределит настройку среды, поэтому установлен только FOO2, я полагаю, этопочему вы спрашиваете.

Я не знаю, где вы взяли синтаксис плюс +, но я ничего не могу найти по этому поводу.Единственное место, где я нашел +, находится в 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

Объединение, которое мы используем Независимый от языка ключ слияния не поддерживает вложенное слияние.Это означает, что ключ либо выбирается из одного объекта, либо из другого, без комбинации.И это задумано, это хорошее поведение в большинстве случаев.Печально то, что нет функции yaml (любой, о которой я знаю), которая поддерживает вложенное слияние, поэтому простой ответ на ваши вопросы: «Нет, это невозможно»


Sidenote: GitLab пыталасьрешить эту проблему для их конфигурации CI с их проприетарным extends, который поддерживает

обратное глубокое слияние на основе ключей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...