跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

怎么通过Docker镜像仓库的API自动化导出镜像层的使用率报告

Docker镜像仓库原生不支持层使用率统计,但可通过调用Registry API枚举镜像、提取layer digest、统计复用频次并结合HEAD请求获取blob大小,近似推导出层复用率与冗余空间。 Docker镜像仓库(Registry)本身 不提供“镜像层使用率”统计功能 ,它是一个内容寻址存储系统,只负责按 digest 存取 blob(层或配置), 不记录、不追踪某一层被多少个镜像引用 。所以,无法直接通过 Registry API 获取“某层被多少镜像共用”或“各层空间占用占比”这类使用率报告。 但你可以 通过组合调用 Registry API + 本地/服务端分析逻辑 ,近似推导出“层复用程度”和“潜在冗余情况”,用于生成类使用率的审计报告。关键思路是: 枚举所有镜像 → 提取各镜像 manifest 中的 layers[].digest → 统计 digest 出现频次 → 关联 blob 大小(需额外获取)→ 计算复用率与空间贡献度 。 以下是可落地的自动化步骤: 获取所有目标镜像清单 调用
/v2/_catalog
(标准 Registry)或 Harbor 对应路径(如
/api/v2.0/projects/{proj}/repositories
),分页拉取全部仓库名及 tag 列表。 必须携带有效认证(Basic Auth 或 Bearer Token) 使用
n=100&last=xxx
分页,避免截断 Harbor 用户注意:需项目级 read 权限,且 catalog 接口默认可能关闭,需确认
harbor.yml
中
registry.compatibility.schema1: false
且未禁用
_catalog
遍历每个镜像,提取 layer digest 列表 对每个
:
,发起请求:
curl -H "Accept: application/vnd.oci.image.manifest.v1+json,application/vnd.docker.distribution.manifest.v2+json" \ -H "Authorization: Bearer $TOKEN" \ https://reg.example.com/v2/$repo/manifests/$tag
解析响应 JSON,提取
layers[].digest
(跳过
mediaType
为 config 的项)。 ⚠️ 注意:digest 格式统一为
sha256:abcdef123...
,比对前建议标准化(去除前缀或统一保留) 统计 digest 复用频次 将所有镜像的 layer digest 收集到一个列表,用 Python/Shell 统计每个 digest 出现次数: Docker Sandbox 创建并管理 Docker 沙箱虚拟机环境以安全执行代理。适用于运行不受信任代码、探索包或隔离代理工作负载。支持 Claude、Codex、Copilot、Gemini 和 Kiro 代理,并提供网络代理控制。 下载 出现 1 次 → 独占层(低复用) 出现 ≥3 次 → 高复用层(如基础 alpine、distroless 层) 可计算“复用层占比” =(复用频次 ≥2 的 digest 数)/ 总 layer digest 数 (可选)估算各层空间占用 Registry API 不返回 blob 大小,但可通过 HEAD 请求
/v2/$repo/blobs/$digest
获取
Content-Length
响应头:
curl -I -H "Authorization: Bearer $TOKEN" \ https://reg.example.com/v2/$repo/blobs/sha256:abc...
将 digest 频次 × 对应大小,即可得出: 每层实际磁盘贡献(bytes) 每层因复用节省的空间 =
size × (freq - 1)
总体冗余空间 = 所有
size × (freq - 1)
之和 生成报告要点 输出 CSV 或 Markdown 表格,至少包含:
digest
(缩略显示)
referenced_by
(引用该层的镜像数)
size_bytes
(原始大小)
saved_bytes
(因复用节省的空间)
top_images
(引用它的前 3 个镜像 tag) 这样一份报告虽非 Registry 原生“使用率”,但真实反映层复用效率,可用于: 识别可下线的老旧镜像(其独占层拖累存储) 评估基础镜像升级影响范围 优化多架构镜像构建策略(减少重复层) 不复杂但容易忽略。

相关文章