Слияние происходит только на верхнем уровне. Если вы хотите объединить ключ на более низком уровне, используйте отдельный шаблон.
Я воссоздал проблему, используя следующий файл compose. Он использует общедоступный образ и запускает команду env
, поэтому можно легко следовать без каких-либо внешних зависимостей.
Вот docker-compose.yml
, который работает автономно, показывая слияние среды:
version: '3.4'
x-service-config: &ref
restart: 'on-failure'
environment: &env
'foo': 'bar'
'bing': 'baz'
services:
bop:
image: 'alpine'
command: 'env'
<<: *ref
Вот вывод, показывающий, что ключ 'environment' от якоря копируется:
$ docker-compose up
Creating network "merge_default" with the default driver
Creating merge_bop_1 ... done
Attaching to merge_bop_1
bop_1 | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
bop_1 | HOSTNAME=d4122a655e1d
bop_1 | foo=bar
bop_1 | bing=baz
bop_1 | HOME=/root
merge_bop_1 exited with code 0
Вот тот же составной файл, но с переопределением 'environment' в определении сервиса 'bop':
version: '3.4'
x-service-config: &ref
restart: 'on-failure'
environment: &env
'foo': 'bar'
'bing': 'baz'
services:
bop:
image: 'alpine'
command: 'env'
environment:
'bat': 'far'
<<: *ref
и соответствующий вывод, показывающий только bat=far
, а не другие переменные:
$ docker-compose up
Creating network "merge_default" with the default driver
Creating merge_bop_1 ... done
Attaching to merge_bop_1
bop_1 | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
bop_1 | HOSTNAME=efe76cb7e09d
bop_1 | bat=far
bop_1 | HOME=/root
merge_bop_1 exited with code 0
Исправление состоит в том, чтобы разбить это на два шаблона / якоря следующим образом:
version: '3.4'
x-service-config: &ref
restart: 'on-failure'
x-environment-config: &env
'foo': 'bar'
'bing': 'baz'
services:
bop:
image: 'alpine'
command: 'env'
environment:
<<: *env
'true': 'false'
<<: *ref
и вот вывод, показывающий объединенные значения:
$ docker-compose up
Creating network "merge_default" with the default driver
Creating merge_bop_1 ... done
Attaching to merge_bop_1
bop_1 | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
bop_1 | HOSTNAME=617f90a94a7d
bop_1 | foo=bar
bop_1 | bing=baz
bop_1 | true=false
bop_1 | HOME=/root
merge_bop_1 exited with code 0
Это работает, потому что вы выполняете слияние по обоим клавишам, которые хотите объединить.