用 docker compose config 先校验最终配置

35 次浏览6 条回复

Compose 文件里有环境变量、多个 override 时,直接 up 才发现缩进或变量没展开,反馈会比较慢。可以先看最终合并结果。

环境:Docker Compose v2,项目根目录有 compose.yaml:

docker compose config

它会校验配置并输出规范化后的结果,适合确认服务名、端口、volumes 和变量展开是否符合预期。只想做校验、不想打印完整配置时:

docker compose config --quiet

如果项目用了多个文件,也可以明确指定顺序:

docker compose -f compose.yaml -f compose.dev.yaml config

注意输出里可能包含展开后的敏感配置,终端日志别直接贴到公共讨论里。

这个命令还有个小用法:如果项目里开了 profile,校验时也可以把 profile 一起带上,不然有些服务不会进最终配置。

docker compose --profile worker config --quiet

适合在 CI 里先挡一下 compose 文件写错的问题,比等到 up 的时候再炸舒服一点。

FinleyLv1#1

这个命令还有个小用法:如果项目里开了 profile,校验时也可以把 profile 一起带上,不然有些服务不会进最终配置。

docker compose --profile worker config --quiet

适合在 CI 里先挡一下 compose 文件写错的问题,比等到 up 的时候再炸舒服一点。

CI 里我会再显式带上 --env-file,避免 runner 的环境变量和本地不一致:

docker compose --env-file .env.ci config --quiet

--quiet 的退出码可以直接交给 CI 判断;如果要排查变量没展开,再临时去掉它看警告和渲染结果。渲染输出可能带密钥,日志里别直接打印。

隔壁空白Lv1#2

CI 里我会再显式带上 --env-file,避免 runner 的环境变量和本地不一致:

docker compose --env-file .env.ci config --quiet

--quiet 的退出码可以直接交给 CI 判断;如果要排查变量没展开,再临时去掉它看警告和渲染结果。渲染输出可能带密钥,日志里别直接打印。

补充一下 CI 里容易忽略的点:--env-file 的相对路径通常按当前工作目录解析,不是按 compose.yaml 所在目录。Runner 里如果先 cd 到项目根目录再执行会更稳;多份 Compose 文件时,也建议把 -f 顺序写死。这样 config --quiet 校验到的才是 CI 实际会用的那套变量和合并结果。

阿线Lv1#3

补充一下 CI 里容易忽略的点:--env-file 的相对路径通常按当前工作目录解析,不是按 compose.yaml 所在目录。Runner 里如果先 cd 到项目根目录再执行会更稳;多份 Compose 文件时,也建议把 -f 顺序写死。这样 config --quiet 校验到的才是 CI 实际会用的那套变量和合并结果。

还有个排查变量来源的办法:Compose v2 可以用 docker compose config --environment 看插值时实际采用的环境。先用它定位本地和 CI 的差异,再回到 config --quiet 做门禁就行。这个输出也可能包含敏感值,别直接放进 CI 日志。

再补个边界:config --quiet 只负责解析和合并配置,不会验证镜像能否拉取、容器能否启动或健康检查是否通过。CI 里可以把它当第一道门,后面再按需接 pull 或启动级检查;这样失败时也更容易判断是配置问题还是运行环境问题。

如果想让缺变量时更早失败,可以在 compose 里把关键环境变量写成这种形式:

environment:
  DATABASE_URL: ${DATABASE_URL:?DATABASE_URL is required}

这样跑 docker compose config --quiet 时就会直接报错,比变量被空串带过去再启动失败好查一点。非关键的本地开关再用默认值会更合适。