可用 docker save 与 pv 组合实现带进度条的镜像导出,通过管道将导出流交由 pv 处理,支持单镜像、多镜像及实时速率、eta 等进度显示。

可以用 docker save 和 pv 组合实现带进度条的镜像导出,关键在于把导出流通过管道交给 pv 处理。
确认 pv 已安装
pv 不是 Docker 自带工具,需单独安装:
- Ubuntu/Debian:
sudo apt-get install pv - CentOS/RHEL:
sudo yum install pv或sudo dnf install pv - macOS(Homebrew):
brew install pv
导出单个镜像并显示进度
先用 docker images 查到目标镜像的名称或 ID,再执行:
docker save 镜像名:tag | pv -s $(docker images --format "{{.Size}}" 镜像名:tag | numfmt --from=iec-i --to=iec-i) > output.tar
但更稳妥、通用的做法是分两步获取大小再传给 pv:
size=$(docker images --format "{{.Size}}" 镜像名:tag | numfmt --from=iec-i --to=si | cut -d' ' -f1 | sed 's/[KMGB]//')<br>if [[ "$size" =~ ^[0-9]+\.?[0-9]*$ ]]; then<br> docker save 镜像名:tag | pv -s "${size}B" > output.tar<br>else<br> docker save 镜像名:tag | pv > output.tar<br>fi
实际常用简化版(兼容性好,自动估算):
docker save nginx:alpine | pv -petr > nginx.tar
-
-p:显示进度条 -
-e:显示 ETA(预估剩余时间) -
-t:显示传输时间 -
-r:实时速率(如 12.4MB/s)
导出多个镜像并监控总体进度
若要打包多个镜像(如 nginx:alpine、redis:7),可先合并再流式处理:
docker save nginx:alpine redis:7 | pv -petr > multi.tar
注意:docker save 支持一次传多个镜像名,pv 会按整个数据流统计,无需手动计算总大小。
常见问题与替代方案
如果 pv 显示 “0B 00:00:00 [0B/s] [=====================================>] 100%”,说明它无法预估总大小 —— 这是正常现象,尤其当镜像层较多或 size 字段含单位时。此时仍能显示实时速率和已传输量。
不想依赖 pv?可用简单方式粗略观察:
- 新开终端运行:
watch -n1 'ls -lh output.tar' - 或用
cat /proc/$(pgrep -f "docker save")/fdinfo/1 | grep pos(较复杂,不推荐日常使用)











