Compose profiles 是什么
profiles 给服务打一个“按需启用”的标记:带 profiles 的服务默认不参与启动,只有显式指定了对应 profile 才会被拉起。它解决的是同一份 compose 文件里既有常驻组件又有偶尔才用的工具的场景,比如数据库管理界面、调试代理、一次性初始化任务。好处是资源不被长期占用,调试端口也不必长期开着,团队共用一个编排文件而不互相干扰。
基本信息
| 定义方式 | 服务下写 profiles: [debug],可以写多个,任一匹配即启用 |
|---|---|
| 启用 | docker compose --profile debug up -d |
| 默认服务 | 没有 profiles 的服务始终参与启动,属于常规栈的一部分 |
| 查看 | docker compose config --profiles 列出文件里定义的全部 profile |
| 环境变量 | COMPOSE_PROFILES=debug 可预设默认启用的列表,也可逗号分隔多个 |
| 停止 | down 时也要带 --profile,否则带 profile 的服务不在操作范围内 |
典型使用场景
- 把数据库管理界面放进 debug profile,默认不启动,需要时临时拉起
- 一次性迁移或初始化任务放进 init profile,执行完就删掉容器
- 可选组件按需启用,如本地 mock 服务、性能分析代理
- 按环境启用不同组件:本地启用热重载,生产启用监控侧车
- 团队共享一份编排文件:各自按需要启用自己那部分服务
compose 示例
compose 示例
services:
web:
image: nginx:1.27-alpine # 常规服务:无 profiles,始终启动
ports:
- "8080:80"
adminer:
image: adminer:4 # 调试工具:默认不启动
profiles: [debug]
ports:
- "127.0.0.1:8081:8080" # 只绑本地回环,降低暴露面
migrate:
image: registry.example.com/team/app:1.2.3
profiles: [init]
command: ["./migrate", "--up"]
depends_on: [web]启用与收尾
启用与收尾
docker compose config --profiles # 先看文件里定义了哪些 profile
docker compose --profile debug up -d # 只启动常规服务加调试工具
docker compose --profile debug ps # 确认调试服务真的起来了
docker compose --profile debug down # 收尾同样要带 profile,否则停不掉
COMPOSE_PROFILES=debug docker compose up -d # 用环境变量预设启用列表启用规则读法
| 情况 | 结果 | 注意 |
|---|---|---|
| 服务没有 profiles | 始终启动 | 属于默认栈成员,无法按需跳过 |
| 有 profiles 但未指定 | 不启动,也不被 down 处理 | 常见误解来源 |
| 多个 profile 混用 | 任一匹配即启动 | 可连续写多个 --profile |
| 启用后未带 profile 停止 | 容器与端口残留 | 排查端口占用时先查它 |
profiles 把常驻栈与偶尔用的工具分开:既避免长期占用资源,也防止调试端口长期暴露在网络上。
调试组件建议只绑定 127.0.0.1 或用内网地址发布端口,避免 profile 一旦启用就把管理界面挂到公网。