使用Docker Compose 3.4的扩展字段功能,是否可以将一组数组形式(或任何数组形式)的一组公共环境变量与特定于服务的声明结合在一起? documentation尚不清楚是否受支持。
在以下YAML上调用docker-compose up
会导致restart
中设置了entrypoint
,volumes
和my-service
,但似乎替换了{ {1}}声明来自扩展字段,其中包含environment
中存在的声明。我希望它们合并。
my-service
答案 0 :(得分:1)
合并仅在顶层进行。如果要在较低级别合并密钥,请使用单独的模板。
我已使用以下撰写文件重新创建了问题。它使用公共映像并运行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
这里是相同的撰写文件,但在“ 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
之所以起作用,是因为您正在两个要合并的键上进行合并。