最可靠镜像一致性检测方式是比对各层layers[].digest值,该sha256哈希基于压缩后layer tar包生成,内容一致则digest必相同,且顺序敏感、跨仓库可复现。

直接比对镜像各层的 layers[].digest 值,是最可靠、最底层的检测方式。这些 digest 是对压缩后 layer tar 包计算出的 SHA256 哈希,内容一致则 digest 必然相同,且顺序敏感、跨仓库可复现。
核心原理:每层都是内容寻址的只读快照
- 每个 layer digest(格式如
sha256:abc123...)由该层实际文件系统变更内容唯一决定 - 修改任意文件、增删指令、调整 Dockerfile 顺序,都会导致该层及后续所有层 digest 全部变化
- config.digest 描述元数据(如 ENV、CMD),不参与文件系统完整性校验
三种高效验证路径
-
本地已有镜像时,用 docker inspect 提取完整层指纹
docker inspect myapp:prod -f '{{range .RootFS.Layers}}{{.}}{{"\n"}}{{end}}'输出即为按构建顺序排列的全部 layer digest 列表,可与可信来源(如 CI 存档、制品库元数据)逐项比对
-
未拉取镜像时,直连 Registry API 获取 digest
- 发送 GET 请求到
/v2/<name>/manifests/<ref></ref></name>,设置 Accept 头为application/vnd.oci.image.manifest.v1+json - 若返回 401,按 WWW-Authenticate 头完成 Bearer Token 认证后再重试
- 解析响应 JSON,遍历
layers数组,提取每个元素的digest字段(跳过mediaType为 config 类型的项)
- 发送 GET 请求到
-
镜像已导出为 tar 包时,解包后做落地校验
- 用
tar -xvf app.tar -C /tmp/check解压 - 进入
/tmp/check/blobs/sha256/,对每个文件运行sha256sum - 将结果与 manifest.json 中
layers[].digest字段严格比对,任一不匹配即说明该层内容已被篡改或存储损坏
- 用
关键提醒
- 不要用 tag(如
:latest)做比对依据,它可被覆盖,不具备确定性 - 必须比对整个 digest 字符串(含
sha256:前缀),不能只截取后几位 - 顺序必须一致:Docker 按 layers 数组顺序叠加,顺序不同即代表构建路径不同,文件系统已实质改变
不复杂但容易忽略











