首页 > 解决方案 > 一次运行多个 docker-compose 覆盖

问题描述

我有一个docker-compose.yml为两个环境设置的文件,dev并且prod

码头工人-compose.yml

包含两个环境的共享配置

version: '3.1'
services:
    homeassistant:
        restart: unless-stopped
        privileged: true
        network_mode: host

docker-compose.dev.yml

包含开发环境的配置

version: '3.1'
services:
    homeassistant:
        image: registry.gitlab.com/addisonlynch/homeassistant/hass:dev
        container_name: hass-dev

码头工人-compose.prod.yml

包含生产环境的配置

version: '3.1'
services:
    homeassistant:
        image: registry.gitlab.com/addisonlynch/homeassistant/hass:prod
        container_name: hass-prod

我可以按如下方式运行开发环境:

docker-compose -f docker-compose.yml -f docker-compose.dev.yml up

和产品环境:

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

两种环境都可以完美运行,但是我只能同时运行一个。如果我在 dev 运行时(在同一主机上)尝试启动 prod,则 dev 容器将退出并且 prod 容器将启动(有效地替换它们)。如何同时运行两个环境?

标签: dockerdocker-compose

解决方案


如果你这样做docker-compose --help,你会看到:

 -p, --project-name NAME     Specify an alternate project name
                              (default: directory name)

这意味着,默认情况下,当您这样做时docker-compose up,Compose 将您的服务作为项目的一部分进行管理,该项目以文件所在的目录名称命名docker-compose.yml。由于您的 dev & prod compose 文件位于同一目录中并且具有相同的服务名称,因此 Compose 无法区分一个与另一个。

考虑到这一点,为了同时运行 dev 和 prod 环境,您需要通过以下方式指定项目名称-p--project-name标志:

docker-compose -f docker-compose.yml -f docker-compose.dev.yml -p dev_env up

另一种选择是使用COMPOSE_PROJECT_NAME环境变量,如:

COMPOSE_PROJECT_NAME=dev_env docker-compose -f docker-compose.yml -f docker-compose.dev.yml up

host如果 dev 和 prod 都使用相同的端口,则您的情况下的潜在问题可能是网络模式。在这种情况下,您第二个启动的将无法启动。


推荐阅读