Docker镜像仓库原生不支持层使用率统计,但可通过调用Registry API枚举镜像、提取layer digest、统计复用频次并结合HEAD请求获取blob大小,近似推导出层复用率与冗余空间。
Docker镜像仓库(Registry)本身
不提供“镜像层使用率”统计功能
,它是一个内容寻址存储系统,只负责按 digest 存取 blob(层或配置),
不记录、不追踪某一层被多少个镜像引用
。所以,无法直接通过 Registry API 获取“某层被多少镜像共用”或“各层空间占用占比”这类使用率报告。
但你可以
通过组合调用 Registry API + 本地/服务端分析逻辑
,近似推导出“层复用程度”和“潜在冗余情况”,用于生成类使用率的审计报告。关键思路是:
枚举所有镜像 → 提取各镜像 manifest 中的 layers[].digest → 统计 digest 出现频次 → 关联 blob 大小(需额外获取)→ 计算复用率与空间贡献度
。
以下是可落地的自动化步骤:
获取所有目标镜像清单
调用
(标准 Registry)或 Harbor 对应路径(如
),分页拉取全部仓库名及 tag 列表。
必须携带有效认证(Basic Auth 或 Bearer Token)
使用
分页,避免截断
Harbor 用户注意:需项目级
read
权限,且 catalog 接口默认可能关闭,需确认
中
且未禁用
遍历每个镜像,提取 layer digest 列表
对每个
,发起请求:
解析响应 JSON,提取
(跳过
为 config 的项)。
⚠️ 注意:digest 格式统一为
,比对前建议标准化(去除前缀或统一保留)
统计 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 请求
获取
响应头:
将 digest 频次 × 对应大小,即可得出:
每层实际磁盘贡献(bytes)
每层因复用节省的空间 =
总体冗余空间 = 所有
之和
生成报告要点
输出 CSV 或 Markdown 表格,至少包含:
(缩略显示)
(引用该层的镜像数)
(原始大小)
(因复用节省的空间)
(引用它的前 3 个镜像 tag)
这样一份报告虽非 Registry 原生“使用率”,但真实反映层复用效率,可用于:
识别可下线的老旧镜像(其独占层拖累存储)
评估基础镜像升级影响范围
优化多架构镜像构建策略(减少重复层)
不复杂但容易忽略。
/v2/_catalog/api/v2.0/projects/{proj}/repositoriesn=100&last=xxxharbor.ymlregistry.compatibility.schema1: false_catalog: 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/$taglayers[].digestmediaTypesha256:abcdef123.../v2/$repo/blobs/$digestContent-Lengthcurl -I -H "Authorization: Bearer $TOKEN" \
https://reg.example.com/v2/$repo/blobs/sha256:abc...size × (freq - 1)size × (freq - 1)digestreferenced_bysize_bytessaved_bytestop_images