Docker Compose 的 profiles 参数控制服务的存在性,未声明 profiles 的服务属于 default profile 并始终启动;声明 profiles 的服务仅在启用对应 profile 时运行,且一个服务可属多个 profile,default 不可显式声明。

在 Docker Compose 中,profiles 参数用于标记服务是否属于某个运行“轮廓”(Profile),从而实现按需启动——只有显式启用对应 profile 时,该服务才会被创建和启动。它不是用来控制环境变量或配置分支,而是控制服务的**存在性**。
定义服务的 profiles
在 docker-compose.yml 中,为服务添加 profiles 字段,值为字符串数组:
- 不声明
profiles的服务默认属于defaultprofile,始终启动 - 声明了
profiles的服务,只在指定 profile 被启用时才启动 - 一个服务可属于多个 profile,例如
["dev", "test"]
示例:
services:
app:
image: myapp:latest
# 没有 profiles → 属于 default,总是启动
<p>db:
image: postgres:15
profiles: ["dev", "test"]</p><p>redis:
image: redis:7-alpine
profiles: ["dev"]</p><p>nginx:
image: nginx:alpine
profiles: ["prod"]
</p>
启用 profile 启动服务
使用 docker compose --profile 指定一个或多个 profile,再执行 up、ps 等命令:
-
docker compose --profile dev up -d:启动app(default)、db(含 dev)、redis(含 dev) -
docker compose --profile dev --profile test up -d:启动app、db(匹配任一即可)、redis,但不启动nginx -
docker compose --profile prod up -d:启动app和nginx,跳过db和redis
注意:--profile 必须放在 up 等子命令之前,否则会被忽略。
与 default profile 共存的逻辑
default profile 始终隐式启用,无需手动指定。这意味着:
- 所有未声明
profiles的服务都会运行 - 即使只启用
prod,app仍会启动(因属 default) - 若想让某服务**仅在特定 profile 下运行**,必须显式将其从 default 中排除 —— 即必须声明
profiles,且不包含default(Compose 不支持显式写["default"],default 是自动附加的例外)
因此,“纯 profile 专属服务”只需声明非 default 的 profile 名即可,如 profiles: ["ci"]。
实用建议与常见误区
Profiles 适合区分开发、测试、CI、生产等不同场景的服务依赖,但要注意:
- 不能用 profiles 替代环境变量或条件化配置(如端口、卷路径),那些需配合
.env或多文件(-f)使用 - 同一个服务不能同时属于
default和其他 profile —— 它要么无 profiles(即 default),要么有 profiles(即非 default) - 运行
docker compose ps时,默认只显示 default + 当前启用的 profile 对应的服务;加--all可看到所有定义的服务(含未启用的) - 在 CI 脚本中推荐显式指定 profile,避免误启开发专用服务(如 UI mock server、localstack)










