如何让docker-compose.yml仅作为网关批量运行多个docker-compose文件
用docker-compose作为网关批量启动微服务的解决方案
需求背景
某项目包含13个容器化微服务,需要通过一个docker-compose.yml作为统一启动入口(网关),批量运行所有子项目的docker-compose.yml文件,采用.env文件是这类场景的最佳实践。
初始配置与问题
先准备两个子项目的示例docker-compose文件:
project1.yml
version: '3' services: hello_world_a: image: redis:latest container_name: hw_a hello_world_b: image: redis:latest container_name: hw_b
project2.yml
version: '3' services: hello_world_2: image: redis:latest container_name: hw_2
最初创建的主docker-compose.yml包含一个多余服务:
version: '3' services: apps: image: redis:latest container_name: hw_c env_file: - .env
对应的.env文件配置:
COMPOSE_PATH_SEPARATOR=: COMPOSE_FILE=project1.yaml:docker-compose.yaml:project2.yaml
执行docker compose up -d后能成功启动所有容器,但主文件里的apps服务完全多余,我们需要让主文件仅作为启动入口,不创建任何实际容器。
无效尝试
为了消除多余服务,尝试用scratch镜像构建空容器,修改主docker-compose.yml为:
version: '3' services: apps: build: context: ./ dockerfile: DockerFile container_name: apps env_file: - .env
配套的DockerFile内容:
FROM scratch
执行时直接报错:Error response from daemon: No command specified,这种方案无法实现需求。
最终可行方案
直接修改.env文件,移除对主docker-compose.yaml的引用:
COMPOSE_PATH_SEPARATOR=: COMPOSE_FILE=project1.yaml:project2.yaml
同时可以把主docker-compose.yml简化为仅保留版本和空服务块(保留空services块更规范):
version: '3' services:
此时执行docker compose up -d,docker-compose会自动加载.env中指定的所有子项目配置文件,启动所有微服务,且主文件不会创建任何多余容器,完美实现“仅作为启动网关”的需求。
内容的提问来源于stack exchange,提问作者M a m a D
相关产品推荐
相关产品推荐

