执行docker pull前如何查询将要拉取的镜像数据量大小?
Docker 拉取前预计算待更新层大小的实操方案
优先选思路A,本地即可完成无需额外资源
你可以按以下步骤落地,不用依赖外部服务:
- 第一步先拿 registry 端的层信息:执行
docker manifest inspect --verbose <镜像地址:标签>,不需要下载实际层,就能直接拿到 registry 中所有压缩层的 sha256 哈希,以及每个压缩层对应的大小。 - 第二步本地计算现有镜像的压缩层哈希:Docker 20.10 及以上版本可以直接从本地元数据里查对应关系,不用全量导出镜像。先执行
docker inspect <本地镜像名:标签>拿到本地每层的解压哈希,再去/var/lib/docker/image/overlay2/imagedb/content/sha256/下找对应镜像的元数据文件,就能直接匹配到每层对应的压缩哈希。如果是旧版本 Docker,也可以用docker save <本地镜像名:标签> -o temp.tar导出镜像包,解压后直接计算每个层的layer.tar.gz压缩包的 sha256 值即可。 - 第三步做差集计算:把 registry 返回的层哈希和本地计算出的压缩层哈希做对比,不存在于本地的层对应的大小累加,就是你执行 pull 操作时需要下载的总数据量。
小优化:如果你的 registry 支持批量查询,也可以直接跳过本地哈希计算,调用 registry 的 HEAD /v2/<仓库名>/blobs/<层哈希> 接口,返回的 Content-Length 就是对应层的大小,不用下载完整层文件
思路B适合本地无原始镜像缓存的场景
如果本地已经没有旧镜像的相关缓存,没法直接计算压缩哈希,可以直接用轻量脚本批量拉取所有层的元数据:
- 先拉取目标镜像的 manifest 拿到全部层的压缩哈希
- 对每个哈希调用上面提到的 registry HEAD 接口拿大小,和本地现存的所有压缩层哈希做匹配,差集的大小总和就是待下载的数据量,不需要第三方服务器中转下载完整层。
注意:如果 registry 开启了鉴权,调用 API 时需要在请求头带上对应的鉴权 token。
内容的提问来源于stack exchange,提问作者StampyCode
相关产品推荐
相关产品推荐

