Поддерживает ли docker-compose слияние переменных среды поля расширения с объявлениями служб? - PullRequest
0 голосов
/ 02 июля 2019

Используя функцию полей расширения в Docker Compose 3.4, возможно ли объединить общий набор переменных среды в виде массива (или любого массива) с объявлениями, специфичными для службы?В документации неясно, поддерживается ли это.

Вызов docker-compose up для следующего YAML приводит к установке restart, entrypoint и volumes в my-service, но, похоже, он заменяет объявление environment, поступающее из поля расширения, на объявление, существующее в my-service.Я бы хотел, чтобы они слились.

version: '3.4'
x-service-config: &service-config
  restart: "on-failure"
  entrypoint: ""
  volumes:
    - "~/.aws:/home/serviceuser/.aws"
  environment:
    - "CommonVar1=foo"
    - "CommonVar2=bar"
services:
  my-service:
    <<: *service-config
    image: my-service:latest
    environment:
      - "ServiceVar1=baz"

1 Ответ

1 голос
/ 02 июля 2019

Слияние происходит только на верхнем уровне. Если вы хотите объединить ключ на более низком уровне, используйте отдельный шаблон.


Я воссоздал проблему, используя следующий файл 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

Это работает, потому что вы выполняете слияние по обоим клавишам, которые хотите объединить.

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