为何docker-compose ps --services显示所有服务而非指定配置文件中的服务?
Docker Compose v2执行
ps --services显示所有服务而非指定文件服务的原因及解决办法 问题重现
执行以下命令启动服务:
docker-compose --compatibility -f docker-compose.yml up --scale es01=0 --scale elasticsearch-mapping-init=0 --scale analytics-db=0 docker-compose --compatibility -f docker-compose.app.yml up --scale autocomplete-service=0
随后执行:
docker-compose -f docker-compose.app.yml ps --services
预期仅显示docker-compose.app.yml中定义的3个服务,但实际输出了所有启动过的服务:
backoffice-db booking-ending-db booking-engine-service master-service objectstore-service profile-service sagev2-service supplier-service directory-db
其中docker-compose.app.yml仅包含master-service、supplier-service、booking-engine-service三个服务。
环境信息:
- Docker Compose版本:v2.6.0
- 使用镜像:aws/codebuild/standard:6.0
- 升级自aws/codebuild/standard:4.0(对应Docker Compose 1.26.0)后出现此问题
原因分析
核心差异来自Docker Compose v1和v2的项目管理模型变化:
- Docker Compose v1中,
-f参数会直接限定命令作用的配置文件范围,即使同一目录下启动了多个compose文件的服务,执行ps --services时只会显示指定-f文件内的服务。 - Docker Compose v2采用了统一的项目概念:所有未通过
-p/--project-name指定项目名的服务,都会默认归到以当前目录名称命名的项目中。此时-f参数在ps命令中的作用是加载配置文件来识别项目,但不会过滤服务——只要服务属于该项目,无论来自哪个compose文件,都会被列出。
你先后用两个不同的compose文件启动服务,且都未指定独立的项目名,导致所有服务被归到同一个默认项目下,因此执行ps --services时会显示整个项目的所有服务。
解决办法
方法1:启动服务时指定独立项目名
启动不同compose文件的服务时,通过-p/--project-name参数指定不同的项目名,将服务隔离到不同项目:
# 启动docker-compose.yml的服务,指定项目名main-project docker-compose -p main-project --compatibility -f docker-compose.yml up --scale es01=0 --scale elasticsearch-mapping-init=0 --scale analytics-db=0 # 启动docker-compose.app.yml的服务,指定项目名app-project docker-compose -p app-project --compatibility -f docker-compose.app.yml up --scale autocomplete-service=0
之后查询docker-compose.app.yml的服务时,指定对应的项目名即可:
docker-compose -p app-project -f docker-compose.app.yml ps --services
方法2:清理现有项目后重新启动(仅适用于测试环境)
如果不需要保留现有服务,可以先停止并移除所有服务,再重新启动目标compose文件的服务(确保只启动该文件的服务,避免混入其他服务到同一项目):
# 停止并移除所有服务 docker-compose down # 仅启动docker-compose.app.yml的服务 docker-compose --compatibility -f docker-compose.app.yml up --scale autocomplete-service=0
此时执行docker-compose -f docker-compose.app.yml ps --services就只会显示该文件内的服务。
内容的提问来源于stack exchange,提问作者tuk
相关产品推荐
相关产品推荐

