把 2.3G 的镜像 docker save 成 tar 用 scp 传到离线机房,docker load 到百分之八十报 unexpected EOF,文件大小和目标端一致,看不出哪里断了。
排查方向其实有限,先把可能性排一排。scp 中途断过一次,重连后接着传,文件长度对了但中间一段是空洞;save 时磁盘刚好写满,tar 尾部没写完就返回了成功;传输经过了一个会改写换行的代理,二进制内容被破坏;两端 docker 版本差太多,tar 里的 manifest 格式解析不了。
校验文件完整性再传
docker save app:1.4 -o app.tar && sha256sum app.tar
传输后比对两端摘要
sha256sum app.tar
然后用 gzip 压缩减少传输中断面
docker save app:1.4 | gzip > app.tar.gz && scp app.tar.gz root@10.0.0.9:/data/
目标端解压并加载
gunzip -c app.tar.gz | docker load
同事提醒我看一下最近一次发布,时间点确实对得上。
命令输出我都留了记录,免得改完记不清原来的值。
改完先别撤,确认这几项。两端 sha256 一致,docker load 走完没有 EOF 报错,docker images 里能看到完整 tag 且能起容器。
大文件传输一定要校验摘要,大小一样不代表内容一样;离线环境优先 gzip 管道,中断后重传的成本也低。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
