想把调试工具、迁移任务这类服务放进同一个 compose 文件,却不想默认启动?profiles 就是干这个的。这篇逐项实测哪些命令会激活它、依赖带 profile 的服务会怎样,以及一个容易留下残留容器的 down 陷阱。
docker compose config --services:app docker compose --profile debug config --services:app debug tools docker compose up -d 之后在运行的服务:['app'] --profile tools up -d:['app', 'tools'] --profile debug up -d:['app', 'debug', 'tools'](tools 同时属于 tools 和 debug 两个 profile) 环境变量 COMPOSE_PROFILES=tools,up -d:['app', 'tools']
--profile 参数或环境变量 COMPOSE_PROFILES;一个服务可以属于多个 profile,任意一个被激活就会启动。
docker compose up -d debug(没有 --profile):退出码 0;在运行的服务:['debug'] run 之后留下的容器:[] docker compose run --rm tools echo …(没有 --profile):退出码 0;输出:hello-from-tools
直接 up 或 run 某个带 profile 的服务不需要 --profile,点名本身就激活了它。
app depends_on debug,不加 profile:退出码 1;输出:service "app" depends on undefined service "debug": invalid compose project;在运行的服务:[] 加 --profile debug:退出码 0;在运行的服务:['app', 'debug', 'tools']
没有 profile 的服务不能依赖带 profile 的服务,除非同时激活那个 profile,否则 compose 直接报「依赖了未定义的服务」。
--profile "*" up -d:['app', 'debug', 'tools'] 不带 profile 的 docker compose down 之后剩下的:['debug', 'tools'] --profile "*" down 之后:[]
不带 profile 的 docker compose down 只处理当前激活的服务,带 profile 的容器会留下来。清理要加 --profile "*"。