You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在推送前估算Docker镜像的压缩后大小?

如何在推送Docker镜像至Harbor前估算压缩后的大小

以下是几种实用的估算思路,均不需要依赖Harbor侧的操作,完全在本地完成计算:

方法一:直接读取Docker本地存储的压缩层文件

Docker本地存储的镜像层本身就是以压缩格式(diff.tar.gz)存放的,直接统计这些文件的大小总和,结果最接近实际推送的大小。

# 替换为你的镜像标签
IMAGE_TAG="your-image:tag"

# 获取镜像ID及所有层ID
IMAGE_ID=$(docker inspect --format='{{.Id}}' "${IMAGE_TAG}")
LAYER_IDS=$(docker inspect --format='{{range .RootFS.Layers}}{{println .}}{{end}}' "${IMAGE_ID}" | cut -d':' -f2)

# 遍历层文件计算总大小(以overlay2存储驱动为例,其他驱动需调整路径)
TOTAL_SIZE=0
for LAYER in ${LAYER_IDS}; do
  LAYER_PATH="/var/lib/docker/overlay2/${LAYER:0:2}/${LAYER}/diff.tar.gz"
  if [ -f "${LAYER_PATH}" ]; then
    SIZE=$(stat -c%s "${LAYER_PATH}")
    TOTAL_SIZE=$((TOTAL_SIZE + SIZE))
  fi
done

# 转换为易读单位
echo "估算压缩后总大小:$(echo "scale=2; ${TOTAL_SIZE} / 1024 / 1024" | bc) MB"

方法二:模拟Docker压缩逻辑估算

如果无法直接访问Docker存储目录,可以导出镜像为未压缩tar包,再用gzip(Docker默认压缩算法)压缩后查看大小,误差在可接受范围内。

# 替换为你的镜像标签
IMAGE_TAG="your-image:tag"

# 导出未压缩镜像包并压缩
docker save "${IMAGE_TAG}" -o temp-image.tar
gzip -c temp-image.tar > temp-image.tar.gz

# 输出估算大小并清理临时文件
echo "估算压缩后总大小:$(stat -c%s temp-image.tar.gz | awk '{print $1/1024/1024 " MB"}')"
rm temp-image.tar temp-image.tar.gz

方法三:通过Docker API获取预计算的层大小

利用Docker本地API直接读取每个层的压缩后大小,无需手动定位文件路径,更简洁。

# 替换为你的镜像标签
IMAGE_TAG="your-image:tag"

# 调用Docker API获取所有层的压缩大小并求和(需提前安装jq)
TOTAL_SIZE=$(curl -s --unix-socket /var/run/docker.sock http://localhost/images/${IMAGE_TAG}/json | \
  jq -r '.RootFS.Layers[]' | cut -d':' -f2 | \
  xargs -I {} curl -s --unix-socket /var/run/docker.sock http://localhost/blobs/{} | \
  jq -r '.Size' | awk '{sum += $1} END {print sum}')

echo "估算压缩后总大小:$(echo "scale=2; ${TOTAL_SIZE} / 1024 / 1024" | bc) MB"

注意事项

  • 以上方法的估算误差通常在5%以内,足够满足预警需求;
  • 如果是增量推送(镜像包含已存在于Harbor的共享层),需要手动减去已存在层的大小,才能得到实际需要推送的数据量。

内容的提问来源于stack exchange,提问作者doruk.sonmez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:30:59