docker compose覆盖ports属性而不是合并它

时间:2018-02-18 11:34:21

标签: docker nginx docker-compose

我的码头组成配置看起来像这样:

搬运工-compose.yml

version: '3.5'

services:
    nginx:
        ports:
            - 80:80

搬运工-compose.prod.yml

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

现在,当我运行命令:8000时,nginx在主机上公开了两个端口:80version: '3.5' services: nginx: ports: - 8080:8080 - 80:80 ,因为它合并了端口属性:

80

有没有办法覆盖它?我想只公开端口dateNow = 2 console.log(dateNow == 1) console.log(dateNow == 1 || 2) console.log(true == 0) console.log(true == 1) console.log(true == 2)

4 个答案:

答案 0 :(得分:5)

此行为记录在https://docs.docker.com/compose/extends/#adding-and-overriding-configuration

  

对于多值选项portsexposeexternal_linksdnsdns_searchtmpfs,Compose连接两个集合值

由于ports将是所有撰写文件中端口的串联,我建议创建一个新的docker-compose.dev.yml文件,其中包含您的开发端口映射,将其从基础{{1文件。

正如Nikson所说,您可以将此docker-compose.yml命名为自动应用您的开发配置,而无需链接docker-compose文件。如果手动指定其他覆盖文件(例如docker-compose.override.yml

,则不会应用docker-compose.override.yml

答案 1 :(得分:0)

使用.override.yml文件覆盖属性,并且需要重写明确的属性分离

docker-compose.override.yml

前:

version: '3.5'

services:
    nginx:
        ports:
            - 80:80

默认值:

docker-compose up

将使用您的docker-compose.ymldocker-compose.override.yml文件

参考:docker-compose multiple compose

答案 2 :(得分:0)

我遇到了同样的问题。提出的带有docker-compose.override.yml的解决方案听起来不错,而且还是正式的解决方案。

尽管对于我自己的一些项目,我已经应用erb模板引擎来使docker-compose.yml.erb文件针对多种环境进行编译。简而言之,我使用:

COMPOSE_TEMPLATE_ENV=production erb docker-compose.yml.erb > docker-compose.yml
COMPOSE_TEMPLATE_ENV=production erb docker-compose.yml.erb > docker-compose-production.yml

然后,我可以在模板中使用ENV['COMPOSE_TEMPLATE_ENV'],还可以使用ERB的语法,因此只需要配置一个文件,而不必担心正确地进行文件配置。 Here's the short post article I've written about it

答案 3 :(得分:0)

暂时不可能,但我找到了使用命令 yq 解决此问题的好方法。 您需要从原始文件中删除端口。

示例:
请注意,此命令将从您当前的 docker-compose.yml 中删除 nginx 端口(因为 -i 选项)

yq e -i 'del(.services.nginx.ports)' docker-compose.yml

您可以在您的部署脚本上或在您的 docker-compose up -d

之前手动执行此命令

docker-compose 上还有一个打开的 issue,您可能需要偶尔检查一下。