拉一个 1.8G 的镜像,到 76% 报 failed to register layer: unexpected EOF,重试三次都停在同一个 digest。docker images 里留着一个半成品 tag。乍看像缓存或者权限的锅,追下去往往不是。
docker system df docker rmi -f api:3.2 docker image prune -f docker pull api:3.2
追下去是这么回事:下载中断后部分层已经落在本地 content store,元数据没写完,下次拉取复用了坏的那份。直接再 pull 会命中本地残缺层,报同样的错。
碰到「镜像层损坏」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
具体做法是,先删掉本地那个半成品 tag 别让它继续被复用;清一次悬空层和构建缓存 把残缺内容带走;重新拉取时带上完整 digest 避免标签指向变化;拉完用 docker run 起一次 确认镜像可用。
验收就看一点,重新拉取走完 100%,docker images 里镜像 ID 完整,容器能正常启动。
