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
, который поддерживает
обратное глубокое слияние на основе ключей