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

如何在多个组合文件中覆盖docker compose值?,docker,docker-compose,yaml,dockerfile,Docker,Docker Compose,Yaml,Dockerfile,假设我有3个组合文件(只关注mysql服务) docker-compose.yml docker-compose.staging.yml docker-compose.prod.yml 在我的docker compose.yml中,我有我的基本mysql内容和开发人员构建目标 version: "3.4" services: mysql: build: target: dev ... 首先是 docker compose up-d 在我的登台

假设我有3个组合文件(只关注mysql服务)

docker-compose.yml

docker-compose.staging.yml

docker-compose.prod.yml

在我的docker compose.yml中,我有我的基本mysql内容和开发人员构建目标

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中放入一个空数组,但没有成功(端口仍然公开):

最后,我想将up命令堆叠如下:

mysql:
  extends:
    file: docker-compose.yml
    service: mysql
  ports:
    - 3306:3306
  # other definitions 
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阶段,以使构建的容器之间没有任何差异。 所以复制东西并不是一个真正的选择


谢谢

你可以考虑在这样的撰写文件中使用<代码>扩展< /代码>键:

mysql:
  extends:
    file: docker-compose.yml
    service: mysql
  ports:
    - 3306:3306
  # other definitions 
尽管您必须将compose版本从
3.4
更改为
3
(如
2.3
),因为v3不支持此功能,因为有一个打开的功能请求挂起很长时间

重要注意事项这里是,您不应该公开基本
docker compose.yml
文件中的任何端口,只在特定的组件上

编辑

target
子句在
v2.0
中不受支持,因此我已经调整了答案,以匹配
extends
target
要求。这就是compose
v2.3

根据评论编辑


由于存在
deploy
关键字需求,因此存在
compose v3
需求。至于现在,不可能扩展composes。我在一些官方文件中读到(现在找不到供参考)他们鼓励我们使用特定于环境的平面组合,以便始终清晰。Docker还表示,这很难在v3中实现(参考上述问题),而且不会很快在任何地方实现。每个环境必须使用单独的组合文件

> P>你可以考虑在这样的撰写文件中使用<代码>扩展< /Cord>键:< /P>
mysql:
  extends:
    file: docker-compose.yml
    service: mysql
  ports:
    - 3306:3306
  # other definitions 
尽管您必须将compose版本从
3.4
更改为
3
(如
2.3
),因为v3不支持此功能,因为有一个打开的功能请求挂起很长时间

重要注意事项这里是,您不应该公开基本
docker compose.yml
文件中的任何端口,只在特定的组件上

编辑

target
子句在
v2.0
中不受支持,因此我已经调整了答案,以匹配
extends
target
要求。这就是compose
v2.3

根据评论编辑


由于存在
deploy
关键字需求,因此存在
compose v3
需求。至于现在,不可能扩展composes。我在一些官方文件中读到(现在找不到供参考)他们鼓励我们使用特定于环境的平面组合,以便始终清晰。Docker还表示,这很难在v3中实现(参考上述问题),而且不会很快在任何地方实现。每个环境必须使用单独的组合文件

实际上,我强烈建议不要在撰写文件中使用“target”命令。我发现为本地/登台/生产构建一个映像非常有益——构建一次,测试它,并在每个环境中部署它。在这种情况下,您可以使用环境变量或挂载的secrets/config文件更改内容


此外,使用compose构建图像是。。。易碎的我建议在CI系统中构建图像,将它们推送到注册表,然后在您的撰写文件中使用图像版本标记-这是一个更具可复制性的系统。

我实际上强烈建议不要在撰写文件中使用“target”命令。我发现为本地/登台/生产构建一个映像非常有益——构建一次,测试它,并在每个环境中部署它。在这种情况下,您可以使用环境变量或挂载的secrets/config文件更改内容


此外,使用compose构建图像是。。。易碎的我建议在CI系统中构建图像,将它们推送到注册表,然后在您的compose文件中使用图像版本标记-这是一个更可复制的系统。

我以前使用docker compose<3,但这里似乎不支持“target”指令:/哦,我误解了。。。他们为目标指令“在3.4中添加”而编写,所以我认为只有3.4和以上。。。但在2.xdoc版本中,他们说“添加到2.3中”。。。所以我会试试看,很抱歉我在发布之前没有检查,我也刚刚发现了,试试
2.3
。将调整我的答案。好的,我已经看到了,我们也在使用“deploy”指令,所以