通过 profiles 字段标记服务并用 --profile 参数启动,可精准控制服务启停:未设 profiles 的服务默认运行,设 profiles 的服务仅在对应 profile 激活时启动;支持多 profile 关联,且 --profile 必须紧邻 docker compose 命令。

直接用 profiles 字段标记服务,再通过 --profile 参数启动对应组,就能精准控制哪些服务运行——它不改配置、不换文件,只决定“存在与否”。
给服务打上 profile 标签
在 docker-compose.yml 里为需要按需启动的服务加上 profiles 字段:
- 没写
profiles的服务属于默认组(default),每次都会启动 - 写了
profiles: ["dev"]的服务,只在启用dev时才创建和运行 - 一个服务可属多个 profile,比如
profiles: ["dev", "test"],任一被启用就启动
示例片段:
services:
app:
image: myapp:latest
db:
image: postgres:15
profiles: ["dev", "test"]
redis:
image: redis:7-alpine
profiles: ["dev"]
nginx:
image: nginx:alpine
profiles: ["prod"]
启动时指定要激活的 profile
运行命令时把 --profile 放在 up、ps 等子命令前:
-
docker compose --profile dev up -d→ 启动app(default)、db、redis,跳过nginx -
docker compose --profile prod up -d→ 启动app和nginx,不拉起db和redis -
docker compose --profile dev --profile test up -d→db满足任一即启动,redis只属dev也一起起来
注意:--profile 必须紧挨着 docker compose,不能写成 docker compose up --profile dev,否则会被忽略。
区分典型使用场景
profiles 不是环境变量开关,而是服务级“开关”,适合划分不同用途的服务集合:
-
开发环境:加
["dev"]的调试工具、本地 mock 服务、日志分析器 -
测试环境:加
["test"]的测试数据库、桩服务、覆盖率收集器 -
生产环境:加
["prod"]的监控代理、API 网关、备份任务容器 -
CI 流水线:加
["ci"]的 lint 工具、集成测试 runner
所有基础服务(如网关、认证中心)保持无 profiles,确保始终在线;附加能力按需加载。
避开常见理解误区
profiles 控制的是服务是否被创建,不是控制它的内部行为:
- 不能靠它切换数据库地址或端口——那些得用
.env或多文件覆盖(-f) - 不能让一个服务“既属 default 又属 dev”——要么没 profiles(即 default),要么有 profiles(即非 default)
-
default是隐式存在的,不能显式写profiles: ["default"],也不该这么写
想让某服务“只在 dev 启动”,只需声明 profiles: ["dev"] 即可,无需排除其他。

















