在docker-compose 3中扩展服务

Rég*_* B. 16 docker docker-compose

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

version: "3"

services:
  myservice:
    build:
      context: ./myservice
    command: ./something
    environment:
      VAR1: "val1"
      VAR2: "val2"
      VAR3: "val3"
Run Code Online (Sandbox Code Playgroud)

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

myotherservice:
    build:
      context: ./myservice
    command: ./somethingelse
    environment:
      VAR1: "val1-bis"
      VAR2: "val2"
      VAR3: "val3"
Run Code Online (Sandbox Code Playgroud)

有没有办法避免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"
Run Code Online (Sandbox Code Playgroud)

Olu*_*ule 9

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

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

-> cat common.env
      VAR2=val2
      VAR3=val3
Run Code Online (Sandbox Code Playgroud)

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

myotherservice:
  build:
    context: ./myservice
  command: ./somethingelse
  env_file: ./common.env
  environment:
    VAR1: "val1-bis"
Run Code Online (Sandbox Code Playgroud)

参考

  • 在这种情况下,如果 env 文件的名称发生更改,则必须在所有服务中更改它。通过“扩展”,可以通过在一处进行更改来避免这种情况。好吧,你可能会问文件名改变了多少次。 (2认同)

And*_*kur 8

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

请参阅有关扩展字段的文档

  • @RégisB。Yeap for v3.7&gt; = https://docs.docker.com/compose/compose-file/#extension-fields。我在项目中使用它 (3认同)
  • 这个答案具有误导性。使用(即 `&amp; 和 &lt;&lt;`)重用 YAML 配置不是 compose-file 的功能。这只是 YAML 的合并类型功能。阅读此内容以供参考:https://yaml.org/type/merge.html。然而,正确的解释应该是“可以将此答案中的语法与撰写文件的扩展字段功能一起使用”。 (2认同)

Ric*_*fer 5

按照 OP 和扩展字段文档的建议使用 YAML 合并类型时要小心。

合并类型仅适用于字典/映射,但不适用于数组/列表。幸运的是,环境部分可以是字典或数组。所以OP的环境部分的例子是有效的。

然而,volumes 部分必须是一个数组,因此合并在那里不起作用。文档中没有提到对数组的需求,但快速的本地测试揭示了...volumes contains an invalid type, it should be an arraydocker 版本18.09.2

总之,锚点、别名和合并类型在许多情况下可以为您提供帮助,但它们的工作方式确实与通过 合并多个 compose 文件不同docker-compose -f file1 file2,并且与compose 2 中的 extends 指令不同。在那里,列表的合并按预期进行。