grep -nP '\t' docker-compose.yml expand -t 2 docker-compose.yml > tmp.yml && mv tmp.yml docker-compose.yml docker compose config -q
从网页复制的 compose 片段用的是 Tab 缩进,docker compose up 报 yaml: line 12: found character that cannot start any token。cat -A 数了下 ^I 有 6 处。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,YAML 规范明确禁止用制表符做缩进,只允许空格。Tab 在不同编辑器里宽度不一致,解析器没法判断层级,在词法阶段就直接拒绝。
「YAML 缩进」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。
处理上按这个顺序:cat -A 找出所有 ^I 定位行号;编辑器里把 Tab 转成 2 个空格再重新粘贴;仓库加 .editorconfig 固定缩进;提交前用 yamllint 跑一遍。
改完只确认一件事:docker compose config 无输出且退出码 0 服务能正常拉起 6 个容器。
