启动前先用 docker compose config 校验最终配置

34 次浏览5 条回复

改了多个 Compose 文件或环境变量时,可以先把最终合并结果展开并校验一下,不用真的启动容器。

环境:Docker Compose v2.20+,项目根目录执行:

docker compose -f compose.yml -f compose.dev.yml config

只想检查配置是否合法,可以把输出丢掉:

docker compose -f compose.yml -f compose.dev.yml config --quiet

如果用了 .env 或 --env-file,也可以显式指定:

docker compose --env-file .env.test -f compose.yml config --quiet

它会校验 YAML、变量替换和多文件合并,发现未定义变量或字段问题会直接报错;config 本身不会创建或启动容器。排查“本地能跑、CI 配置不对”这类问题时,先看一次展开后的结果挺省事。

补一个容易忽略的点:config 不带 --quiet 时会把展开后的配置打印出来,里面如果有环境变量注入的密钥,CI 日志可能会留痕。流水线里只做校验可以用 config --quiet,需要看结果时也最好先确认敏感值没有被展开;另外把同一组 -f 文件和 --env-file 固定下来,避免本地与 CI 校验的输入不一致。

还可以把服务集合也纳入 CI 校验:docker compose -f compose.yml -f compose.dev.yml config --services。这样 profile 或覆盖文件改动后,服务意外增删会比较容易被发现;需要比对时再把输出排序后和期望列表比较。

雾很大Lv1#2

还可以把服务集合也纳入 CI 校验:docker compose -f compose.yml -f compose.dev.yml config --services。这样 profile 或覆盖文件改动后,服务意外增删会比较容易被发现;需要比对时再把输出排序后和期望列表比较。

如果项目用了 profiles,我还会把要验证的 profile 显式带上;不然 config --services 看到的可能不是 CI 实际启动的服务集合。比如:

docker compose --profile dev -f compose.yml -f compose.dev.yml config --quiet

把 profile、覆盖文件和 --env-file 一起固定下来,校验结果才比较可比。

Ryan小满Lv1#3

如果项目用了 profiles,我还会把要验证的 profile 显式带上;不然 config --services 看到的可能不是 CI 实际启动的服务集合。比如:

docker compose --profile dev -f compose.yml -f compose.dev.yml config --quiet

把 profile、覆盖文件和 --env-file 一起固定下来,校验结果才比较可比。

还有个坑:变量没定义时,Compose 有时只是给警告并替换成空字符串,config --quiet 不一定能把这类错误拦住。对必须存在的值可以在 YAML 里写成 ${IMAGE_TAG:?IMAGE_TAG is required},让校验直接失败;非敏感变量则可以在 CI 里先固定 --env-file。这样配置语法通过和必需变量齐全是两层检查。

这个写法对 CI 很实用。再补一个细节:${IMAGE_TAG:?IMAGE_TAG is required} 会把“未设置”和“设置为空字符串”都拦住;如果只想拦未设置,可以用 ${IMAGE_TAG?IMAGE_TAG is required}。镜像标签这类值通常不该接受空字符串,建议用前一种,能少掉一类看起来校验通过、启动时才出问题的情况。