繁体   English   中英

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

[英]How to override docker-compose values in multiple combined files?

假设我有3个撰写文件(仅关注mysql服务)

docker-compose.yml

docker-compose.staging.yml

docker-compose.prod.yml

在我的docker compose.yml中,我有基本的mysql东西以及dev als构建目标

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

我也知道文档说

对于多值选项端口,暴露,external_links,dns,dns_search和tmpfs,Compose可将两组值连接在一起

但是,如何在不重复配置的情况下达到我的目标?

是的,可以肯定的是,我可以省略docker-compose.staging.yml,但是在staging.yml中定义了构建步骤,生产步骤也应使用它们,以使构建的容器之间没有任何区别。 因此,复制内容并不是真正的选择。

谢谢

实际上,我强烈建议您不要在撰写文件中使用“ target”命令。 我发现为本地/分段/生产构建单个映像非常有益-生成一次,对其进行测试,然后在每个环境中进行部署。 在这种情况下,您可以使用环境变量或装入的机密/配置文件来更改内容。

此外,使用compose构建图像非常脆弱。 我建议在CI系统中构建图像,将其推送到注册表,然后在撰写文件中使用图像版本标签-这是一个更具可复制性的系统。

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

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

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

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

官方文档参考进行扩展

编辑

v2.0不支持target子句,因此我调整了答案以匹配extendstarget要求。 这就是v2.3

从评论中编辑

由于存在deploy关键字需求,因此存在compose v3需求。 并且就目前而言,不可能扩展合成。 我读过一些官方文档(现在找不到它作为参考), 他们鼓励我们使用特定于环境的平面组合,以便始终清楚。 Docker还指出,在v3中很难实现(请参见上一期),并且不会很快在任何地方实现。 您必须为每个环境使用单独的撰写文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM