如何在多个组合文件中覆盖docker-compose值?

时间:2018-05-09 13:17:59

标签: docker docker-compose yaml dockerfile

Letzt想象我有3个撰写文件(只专注于mysql服务)

  

搬运工-compose.yml

     

搬运工-compose.staging.yml

     

搬运工-compose.prod.yml

在我的docker compose.yml中,我有我的基本mysql内容与dev als build target

version: "3.4"
services:
  mysql:
    build:
      target: dev
    ...

开头
  

docker-compose up -d

在我的暂存环境中,我想暴露端口3306,但也想要另一个构建目标,所以我将使用以下内容创建docker-compose.staging.yml。

version: "3.4"
services:
  mysql:
    build
      target: prod
    ports:
      - 3306:3306

并将其与

结合使用
  

docker-compose -f docker-compose.yml -f docker-compose.staging.yml up -d

因此构建目标被覆盖,端口3306现在暴露在外面。

现在我想在docker-compose.prod.yml中使用相同的内容,只是没有将端口3306暴露给外部......如何覆盖ports指令以使端口不暴露?

我试图在prod.yml中放入一个空数组但没有成功(端口仍然暴露):

version: "3.4"
services:
  mysql:
    ports: []

最后我想像这样堆叠up命令:

  

docker-compose -f docker-compose.yml -f docker-compose.staging.yml -f docker-compose.prod.yml up -d

我也知道文档说

  

对于多值选项端口,expose,external_links,dns,dns_search和tmpfs,Compose连接两组值

但是,如果不重复配置,我怎么能达到目标?

是的,我可以省略docker-compose.staging.yml,但是在staging.yml中定义了构建步骤,这也应该用于prod阶段,以便在构建容器之间没有任何差异。 所以重复的东西不是一个真正的选择。

由于

2 个答案:

答案 0 :(得分:0)

我实际上强烈建议不要使用" target"命令文件中的命令。我发现为本地/临时/生产构建单个映像非常有用 - 构建一次,测试它并在每个环境中部署它。在这种情况下,您可以使用环境变量或已安装的机密/配置文件来更改内容。

此外,使用compose构建图像是......脆弱的。我建议在CI系统中构建图像,将它们推送到注册表,然后在撰写文件中使用图像版本标签 - 它是一个更加可重复的系统。

答案 1 :(得分:-2)

您可以考虑在撰写文件中使用extends键,如下所示:

mysql:
  extends:
    file: docker-compose.yml
    service: mysql
  ports:
    - 3306:3306
  # other definitions 

虽然您必须将撰写版本从3.4更改为< 3(例如2.3)因为v3不支持此功能ref,因为有一个打开的功能请求现在挂了很长时间。

重要说明这里是您不应公开基本docker-compose.yml文件中的任何端口,仅限于特定组合。

Oficial docs ref for extends

修改

target不支持

v2.0子句,因此我调整了答案以匹配extendstarget要求。这是组成v2.3

从评论中修改

由于存在deploy关键字要求,因此需要compose v3。至于现在,没有可能扩展作曲。我已经阅读了一些官方文档(现在找不到参考文献)他们鼓励我们使用特定于环境的平面组合,以便它始终清晰。此外,Docker表示在v3中很难实现(参见上述问题),并且它不会很快在任何地方实现。您必须为每个环境使用单独的撰写文件。