Docker Создание массивов слияния для псевдонимов и якорей YAML. - PullRequest
2 голосов
/ 12 апреля 2020

У меня есть следующий сломанный docker -компонентный файл

version: '3.4'

x-vols1: &vols-1
    - /home/:/home/

x-vols2: &vols-2
    - /tmp/:/tmp/

services:
    app1:
        container_name: app1
        image: app1
        volumes:
            <<: *vols-1
    app2:
        container_name: app2
        image: app2
        volumes:
            <<: *vols-1
            <<: *vols-2

Это происходит со следующей ошибкой

$ docker-compose -f test.yaml config
ERROR: yaml.constructor.ConstructorError: while constructing a mapping
  in "./test.yaml", line 14, column 13
expected a mapping for merging, but found scalar
  in "./test.yaml", line 4, column 7

Вопрос 1: Как я могу объединить массивы в docker-compose? Синтаксис, который я пытаюсь использовать, это синтаксис для объединения диктов

Вопрос 2: Если нет способа слияния массивов, есть ли обходной путь?

Использовать case: у меня есть несколько служб, некоторые из них отображают одни тома, другие отображают другие тома, другие отображают все тома. Я не хотел бы повторяться.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 13 апреля 2020

Синтаксис Yaml для слияния предназначен для слияния отображений, а не для массивов. Подробнее об этом см. этот выпуск . Однако, если вы просто добавляете отдельные тома, вам не нужно ничего объединять. Просто вставьте псевдоним как запись массива:

version: '3.4'

x-vols1: &vols-1
    "/home/:/home/"

x-vols2: &vols-2
    "/tmp/:/tmp/"

services:
    app1:
        container_name: app1
        image: app1
        volumes:
            - *vols-1
    app2:
        container_name: app2
        image: app2
        volumes:
            - *vols-1
            - *vols-2
0 голосов
/ 13 апреля 2020

Желаемого поведения можно достичь, используя несколько файлов docker-compose, по одному на каждый том. Обратите внимание, что якоря и псевдонимы не требуются, но держите их в соответствии с вопросом.

base.yaml

version: '3.4'

services:
    app1:
        container_name: app1
        image: app1
    app2:
        container_name: app2
        image: app2

vol1.yaml

version: '3.4'

x-vols1: &vols-1
    volumes:
        - /home/:/home/

services:
    app1:
        container_name: app1
        image: app1
        <<: *vols-1
    app2:
        container_name: app2
        image: app2
        <<: *vols-1

vol2.yaml

version: '3.4'

x-vols2: &vols-2
    volumes:
        - /tmp/:/tmp/

services:
    app2:
        container_name: app2
        image: app2
        <<: *vols-2

Проверить как

$ docker-compose -f base.yaml -f vol1.yaml -f vol2.yaml config

Результат

services:
  app1:
    container_name: app1
    image: app1
    volumes:
    - /home:/home:rw
  app2:
    container_name: app2
    image: app2
    volumes:
    - /home:/home:rw
    - /tmp:/tmp:rw
version: '3.4'

Дополнительная документация https://docs.docker.com/compose/extends/

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