通过 Registry HTTP API v2 直接获取 manifest 和 config,提取 layers[].digest 进行逐层比对,无需拉取镜像或依赖 Docker daemon;需正确设置 Accept 头、处理 token 认证,并标准化 digest 前缀后比对数组顺序与值。

要通过 Docker 镜像仓库 API 自动化提取并比对镜像层指纹,关键在于绕过容器运行时,直接调用 Registry HTTP API v2 获取 manifest 和 config,解析其中的 layer digest(即各层 SHA256 哈希)和 config.digest,再做逐层比对。整个过程无需拉取镜像、不依赖本地 Docker daemon,适合 CI/CD 安全审计或供应链验证场景。
获取镜像清单(Manifest)并确认 MediaType
Registry 要求显式声明期望格式,否则返回 406 错误。必须设置 Accept 头:
- OCI 镜像:使用 Accept: application/vnd.oci.image.manifest.v1+json
- Docker 镜像(v2):使用 Accept: application/vnd.docker.distribution.manifest.v2+json
- 不确定类型时,可合并发送:Accept: application/vnd.oci.image.manifest.v1+json,application/vnd.docker.distribution.manifest.v2+json
示例请求(需先完成 Bearer Token 认证):
curl -H "Accept: application/vnd.oci.image.manifest.v1+json" \-H "Authorization: Bearer $TOKEN" \
https://registry.example.com/v2/myapp/manifests/v1.2.0
解析 manifest 提取 layer digest 列表
响应体为 JSON,结构中 layers 字段是数组,每个元素含 digest(即该层内容哈希)和 mediaType(如 application/vnd.oci.image.layer.v1.tar+gzip):
- 注意:
digest是实际层内容的 SHA256,不是 diffID;它可用于跨 registry 校验一致性 - 若需比对两个镜像是否“层完全一致”,直接比对
layers[].digest数组顺序与值即可(顺序敏感) - 跳过
mediaType为application/vnd.oci.image.config.v1+json的项——那是 config 层,不属于文件系统层
获取并校验 config.digest 关联的元数据
manifest 中的 config.digest 指向镜像配置(含 Cmd、Entrypoint、Labels 等),它本身也是内容寻址对象:
- 用相同 Token 请求:GET /v2/
/blobs/ - 响应体是 JSON,其
rootfs.diff_ids数组给出各层的 diffID(构建时计算,非内容哈希),但不可用于跨 registry 比对 - 真正可用于可信比对的是 manifest 中的
layers[].digest——它们由压缩后 tar 包计算得出,稳定且可复现
自动化比对脚本核心逻辑
用 Python 或 Bash 脚本串联上述步骤,重点实现:
- 自动处理 401 → 解析 WWW-Authenticate → 获取 token(缓存 5 分钟内复用)
- 并发请求两个镜像的 manifest,提取
layers[].digest列表 - 逐项比对数组长度、顺序、每一项 digest 值;输出差异位置与具体 digest
- 可选增强:对任一层 digest,追加请求
/v2/<name>/blobs/<layer_digest></layer_digest></name>并计算 SHA256(验证 registry 是否篡改内容)
不复杂但容易忽略:digest 字符串带前缀 sha256:,比对前需统一截断或正则标准化。


















