在docker-compose 3中扩展服务

时间:2017-07-24 11:38:51

标签: docker docker-compose

我为docker-compose 3创建了一个使用许多环境变量的服务:

version: "3"

services:
  myservice:
    build:
      context: ./myservice
    command: ./something
    environment:
      VAR1: "val1"
      VAR2: "val2"
      VAR3: "val3"

现在我想添加一个使用相同环境变量值的服务,VAL1除外,它有不同的命令:

myotherservice:
    build:
      context: ./myservice
    command: ./somethingelse
    environment:
      VAR1: "val1-bis"
      VAR2: "val2"
      VAR3: "val3"

有没有办法避免docker-compose.yml文件中的环境变量重复?在docker-compose 2中,可以使用extends关键字,但在docker-compose 3中不再是这种情况。

编辑:2017年10月,扩展字段被添加到docker-compose 3.4语法中:https://docs.docker.com/compose/compose-file/#extension-fields这是正确的方法:

version: "3"
x-env:
  &default-env
  VAR1: "val1"
  VAR2: "val2"
  VAR3: "val3"
services:
  myservice:
    build:
      context: ./myservice
    command: ./something
    environment: *default-env
myotherservice:
    build:
      context: ./myservice
    command: ./somethingelse
    environment:
      << : *default-env
      VAR1: "val1-bis"

3 个答案:

答案 0 :(得分:7)

您可以将常见环境变量提取到 env 文件。

此后,您可以在撰写文件中使用env_file配置选项。

-> cat common.env
      VAR2=val2
      VAR3=val3

您仍然可以使用common.env配置选项传递/覆盖environment中指定的环境变量以外的环境变量。

myotherservice:
  build:
    context: ./myservice
  command: ./somethingelse
  env_file: ./common.env
  environment:
    VAR1: "val1-bis"

参考

答案 1 :(得分:3)

使用YAML非常简单:

version: "3"

services:
  myservice: &myservice
    build:
      context: ./myservice
    command: ./something
    environment: &myservice_environment
      VAR1: "val1"
      VAR2: "val2"
      VAR3: "val3"

myotherservice:
    <<: *myservice
    environment:
      <<: *myservice_environment
      VAR1: "val1-bis"

答案 2 :(得分:2)

请注意按照OP和extension fields文档的建议使用YAML合并类型。

合并类型适用于dictionaries/maps only,但不适用于数组/列表。幸运的是,环境部分可以是dictionary or an array。因此,OP的环境部分示例适用。

但是,volumes部分必须是一个数组,并且类似merging will not work there。在文档中没有提到对数组的需要,但是快速本地测试显示...volumes contains an invalid type, it should be an array和docker版本18.09.2

总而言之,锚点,别名和合并类型在许多情况下都可以为您提供帮助,但它们的工作方式与通过docker-compose -f file1 file2合并多个撰写文件不同,并且与extends directive in compose 2不同。在那里,列表的合并符合预期。