Docker Compose合并数组用于YAML别名和锚点

时间:2020-04-12 20:56:45

标签: docker yaml

我有以下损坏的docker-compose文件

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::如果无法合并数组,是否有解决方法?

用例:我有多个服务,其中一些服务映射某些卷,其他服务映射其他卷,其他服务映射所有卷。我不想重复我自己。

谢谢!

2 个答案:

答案 0 :(得分:3)

Yaml合并语法用于合并映射,而不用于数组。有关更多信息,请参见this issue。但是,如果仅添加单个卷,则无需合并任何内容。只需将别名作为数组条目插入即可:

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

答案 1 :(得分:0)

可以通过使用多个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/