docker-compose是否支持将扩展字段环境变量与服务声明合并?

时间:2019-07-02 15:31:11

标签: docker docker-compose

使用Docker Compose 3.4的扩展字段功能,是否可以将一组数组形式(或任何数组形式)的一组公共环境变量与特定于服务的声明结合在一起? documentation尚不清楚是否受支持。

在以下YAML上调用docker-compose up会导致restart中设置了entrypointvolumesmy-service,但似乎替换了{ {1}}声明来自扩展字段,其中包含environment中存在的声明。我希望它们合并。

my-service

1 个答案:

答案 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

之所以起作用,是因为您正在两个要合并的键上进行合并。