当前位置: 首页 > 知识库问答 >
问题:

Docker为YAML别名和锚组成合并数组

田德馨
2023-03-14

我有以下损坏的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-comuse中合并数组?我尝试使用的语法是用于合并字典的语法

问题2:如果没有办法合并数组,有没有变通方法?

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

谢谢你!

共有3个答案

周祺
2023-03-14

这是当前接受的答案的一个细微变化,不需要您更改docker compose命令行以包含其他文件:

version: '3.9'

services:
    app1:
        container_name: app1
        image: app1
        extends:
            file: common-volumes.yml
            service: app1
    app2:
        container_name: app2
        image: app2
        extends:
            file: common-volumes.yml
            service: app2
        volumes:
            - /tmp/:/tmp/
x-vols1: &vols-1
    volumes:
        - /home/:/home/

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

要查看生成的配置,请执行以下操作:

docker compose config
常乐
2023-03-14

所需的行为可以通过使用多个docker-compose文件来实现,每个卷一个。请注意,不需要锚点和别名,但将它们保留在与问题对齐的位置。

< code>base.yaml

version: '3.4'

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

< code>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/

窦宏旷
2023-03-14

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
 类似资料:
  • 我想在YAML中合并数组,并通过ruby加载它们- 我希望组合数组为 我收到错误:在分析块映射时找不到预期的键 我如何在YAML中合并数组?

  • 问题内容: 我正在尝试在docker-compose中安装一个卷以Apache镜像。问题是,我的docker中的apache运行在,但是挂载的目录在之下创建。如何指定挂载目录的用户? 我试图运行命令。但它说 我希望能够指定安装它的用户。有办法吗? 问题答案: 首先确定用户的uid : 然后,在您的Docker主机上,使用uid(在本示例中为100)更改已安装目录的所有者: 动态扩展 如果您正在使用

  • 在结构中相同类型的连续成员之间的指针算术曾经是一种常见做法,而指针算术仅在数组中有效。在C中,它将是显式的未定义行为,因为数组只能由声明或新表达式创建。但是C语言将数组定义为连续分配的非空对象集,具有特定的成员对象类型,称为元素类型。(N1570 草案为 C11,6.2.5 类型 §20)。因此,如果我们可以确保成员是连续的(意味着它们之间没有填充),那么将其视为数组可能是合法的。 下面是一个简化

  • 我可以在不重新键入的情况下重用YAML中的键吗?如果可以通过锚点重复该键,则重命名该键将非常简单。

  • 问题内容: 我有2个数组 我是否可以将这些单独的数组合并为一个并将这些值相加,以便结果为: 这是我目前拥有的功能,但我似乎无法使其工作: 问题答案: 可以用两行代码完成此实际计算,而无需循环: http://codepad.viper-7.com/ieSkHQ 您只需要进行适当的调整即可解决您的嵌套结构。

  • 问题内容: 如何将所有数组项合并为一个字符串? 问题答案: 使用功能。 例如: