Docker为YAML别名和锚点编写合并数组



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

问题2:如果无法合并数组,是否有解决方法?

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

谢谢!

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

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

这是对当前接受的答案的轻微更改,不需要更改docker compose命令行以包括其他文件:

docker-compose.yml

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/

common-volumes.yml

x-vols1: &vols-1
volumes:
- /home/:/home/
services:
app1:
<<: *vols-1
app2:
<<: *vols-1

查看结果配置:

docker compose config

最新更新