[英]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
子句,因此我调整了答案以匹配extends
和target
要求。 这就是v2.3
。
从评论中编辑
由于存在deploy
关键字需求,因此存在compose v3
需求。 并且就目前而言,不可能扩展合成。 我读过一些官方文档(现在找不到它作为参考), 他们鼓励我们使用特定于环境的平面组合,以便始终清楚。 Docker还指出,在v3中很难实现(请参见上一期),并且不会很快在任何地方实现。 您必须为每个环境使用单独的撰写文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.