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

Nat*_*lor 3 docker docker-compose

使用 Docker Compose 3.4 的扩展字段功能,是否可以将数组形式(或任何数组)的一组通用环境变量与特定于服务的声明组合起来?该文档不清楚是否支持这一点。

调用docker-compose up以下 YAML 会导致restartentrypointvolumes被设置my-service,但它似乎将environment来自扩展字段的声明替换为 中存在的声明my-service。我希望他们合并。

version: '3.4'
x-service-config: &service-config
  restart: "on-failure"
  entrypoint: ""
  volumes:
    - "~/.aws:/home/serviceuser/.aws"
  environment:
    - "CommonVar1=foo"
    - "CommonVar2=bar"
services:
  my-service:
    <<: *service-config
    image: my-service:latest
    environment:
      - "ServiceVar1=baz"
Run Code Online (Sandbox Code Playgroud)

pro*_*erq 7

合并仅发生在顶层。如果要合并较低级别的密钥,请使用单独的模板。


我使用以下撰写文件重新创建了该问题。它使用公共映像并运行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
Run Code Online (Sandbox Code Playgroud)

这是输出,显示来自锚点的“环境”键正在被复制:

$ 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
Run Code Online (Sandbox Code Playgroud)

这是相同的撰写文件,但在“bop”服务定义中覆盖了“environment”:

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
Run Code Online (Sandbox Code Playgroud)

以及相应的输出, 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
Run Code Online (Sandbox Code Playgroud)

解决方法是将其分成两个模板/锚点,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

这是显示合并值的输出:

$ 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
Run Code Online (Sandbox Code Playgroud)

这是可行的,因为您正在对要合并的两个键进行合并。