使用docker compose继承或嵌套

Ret*_*mür 28 docker-compose

启动我们的应用程序的最佳方式是使用我们提供的docker compose.该泊坞窗,撰写启动所有与正确配置的服务.

现在我们想提供一个docker-compose,其中应用程序使用不同的后端运行.在这个组成中,8个10个服务是相同的,2个是不同的.

没有代码重复如何实现这一目标? 我看到服务可以从另一个docker-compose文件扩展服务,但是这仍然需要列出两个文件中的所有10个服务.

Jos*_*uis 20

使用docker-compose 1.6,这应该是可能的.

docker-compose.yml使用您的共同服务创建:

service01:
  image: image01
  links:
    - service02

service02:
  image: image02
Run Code Online (Sandbox Code Playgroud)

第二个文件,docker-compose.prod.yml带有您独特的服务:

service03:
  image: image03
  links:
    - service02
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用以下命令启动服务01,02和03:

docker-compose -f docker-compose.yml -f docker-compose.prod.yml
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅官方文档:https: //docs.docker.com/compose/extends/#multiple-compose-files


Jus*_*ner 16

实现此目的的最简单方法是创建第二个撰写文件.在第二个文件中,您可以使用extendDocker Compose 的功能,它允许您从另一个文件"继承"服务:https://docs.docker.com/compose/extends/

假设您的原始文件是docker-compose.yaml,您可以创建一个swap-backend-compose.yaml:

service-one:
  extends:
    file: docker-compose.yaml
    service: service-one

service-two:
  extends:
    file: docker-compose.yaml
    service: service-two
  environment:
    - BACKEND=some_other_value
Run Code Online (Sandbox Code Playgroud)

...等等.

  • 注意`extends`命令已被弃用,并在Compose v3.x中完全[删除](https://docs.docker.com/compose/extends/#extending-services) (10认同)

Zac*_*nta 13

正如评论中所指出的,版本 3 弃用了extends关键字,所以这里是一个没有它的最小示例:

# BASE - docker-compose.base.yml
version: "3"
services:
  api:
    build: .

# DEV - docker-compose.dev.yml
services:
  api:
    command: npm run dev

# PROD - docker-compose.prod.yml
services:
  api:
    command: npm run prod
Run Code Online (Sandbox Code Playgroud)

一些注意事项:

  • 每个环境文件 ( .dev.yml, ) 可以从基础文件 ( ).prod.yml继承、添加和替换配置选项.base.yml
  • 在此示例中,每个环境文件 1) 继承选项build2) 添加自己的command选项
  • 基本文件通常命名为docker-compose.yml;我在这里添加.base只是为了强调继承方面,并且因为我喜欢更明确的名称;请记住docker-compose默认查找docker-compose.ymldocker-compose.override.yml

  • 你可以像这样启动你的产品版本:`docker compose -f docker-compose.yml -f docker-compose.prod.yml up` (3认同)