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阶段,以便在构建容器之间没有任何差异。 所以重复的东西不是一个真正的选择。
由于
答案 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
文件中的任何端口,仅限于特定组合。
修改强>
target
不支持 v2.0
子句,因此我调整了答案以匹配extends
和target
要求。这是组成v2.3
。
从评论中修改
由于存在deploy
关键字要求,因此需要compose v3
。至于现在,没有可能扩展作曲。我已经阅读了一些官方文档(现在找不到参考文献)他们鼓励我们使用特定于环境的平面组合,以便它始终清晰。此外,Docker表示在v3中很难实现(参见上述问题),并且它不会很快在任何地方实现。您必须为每个环境使用单独的撰写文件。