【问题标题】:Inheritance or nesting with docker compose使用 docker compose 继承或嵌套
【发布时间】:2015-10-29 07:21:15
【问题描述】:

启动我们的应用程序的最佳方式是使用我们提供的 docker compose。 docker-compose 使用正确的配置启动所有服务。

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

如何在不重复代码的情况下实现这一点? 我看到一个服务可以从另一个 docker-compose 文件扩展一个服务,但是这仍然需要列出两个文件中的所有 10 个服务。

【问题讨论】:

    标签: docker-compose


    【解决方案1】:

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

    使用您的常用服务创建docker-compose.yml

    service01:
      image: image01
      links:
        - service02
    
    service02:
      image: image02
    

    第二个文件 docker-compose.prod.yml 包含您的独特服务:

    service03:
      image: image03
      links:
        - service02
    

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

    docker-compose -f docker-compose.yml -f docker-compose.prod.yml
    

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

    【讨论】:

    • 请注意有一个已知的 Docker-compose issue,因此如果有多个文件夹,路径将无法正确转发
    【解决方案2】:

    实现此目的的最简单方法是创建第二个撰写文件。在第二个文件中,您可以使用 Docker Compose 的 extend 功能,该功能允许您从另一个文件“继承”服务: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
    

    ...等等。

    【讨论】:

    • 谢谢。但是,这仍然需要在swap-backen-compose.yamlfile 中列出所有 10 个服务,如果我添加新服务,我必须编辑机器人文件。我一直在寻找一种方法来继承或包含整个 compose。
    • @RetoGmür - 我刚刚经历了同样的事情。不幸的是,目前没有办法扩展整个 Docker Compose 配置文件。
    • 我想你会对github.com/docker/compose/pull/2051 感兴趣,它可以在最新的RC 版本github.com/docker/compose/releases/tag/1.5.0rc2 中找到
    • 注意 extends 命令已被弃用,在 Compose v3.x 中完全是 removed
    【解决方案3】:

    正如 cmets 中所述,Version 3 deprecates the extends keyword,所以这是一个没有它的最小示例:

    # BASE - docker-compose.base.yml
    version: "3"
    services:
      api:
        build: .
    
    # DEV - docker-compose.dev.yml
    version: "3"
    services:
      api:
        command: npm run dev
    
    # PROD - docker-compose.prod.yml
    version: "3"
    services:
      api:
        command: npm run prod
    

    几点说明:

    • 每个环境文件 (.dev.yml, .prod.yml) 可以继承、添加和替换基本文件 (.base.yml) 中的配置选项
    • 在本例中,每个 env 文件 1) 继承 build 选项 2) 添加自己的 command 选项
    • 基本文件通常命名为docker-compose.yml;我在这里添加了.base,只是为了突出继承方面,因为我喜欢更明确的名称;请记住docker-compose looks for docker-compose.yml and docker-compose.override.yml by default

    【讨论】:

      猜你喜欢
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多