通过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,否则会被忽略。
理解 default profile 的隐式行为
default 不可显式声明,但始终隐式启用:
- 所有未声明
profiles的服务都会运行 - 即使只启用
prod,app仍会启动(因属default) - 若想让某服务“仅在特定 profile 下运行”,必须显式声明非
default的 profile,例如profiles: ["ci"]
验证和调试常用技巧
快速确认当前配置中定义了哪些 profile:
-
docker compose config --profiles→ 列出所有已定义的 profile 名称 -
docker compose --profile dev ps→ 查看当前激活dev时实际参与的容器列表 - 启动失败时检查依赖:若服务 A 依赖服务 B,而 B 被 profile 排除,Compose 会报错提示 “service B is required by A but is disabled”











