验证 Manifest

验证 Manifest

什么是 Manifest

Docker 镜像的 Manifest(清单)是一个 JSON 文件,描述了镜像的组成:层(layers)、配置(configuration)和元数据。多架构镜像则使用 Manifest List(或 OCI Image Index)包含多个架构的 Manifest 引用。

查看 Manifest

基础 manifest 查看

# 查看镜像 manifest(默认格式)
docker manifest inspect nginx:latest

# 查看原始 JSON
docker manifest inspect --verbose nginx:latest

查看 OCI Image Index

# 查看多架构镜像的 manifest list
docker manifest inspect myapp:latest

输出示例:

{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 942,
         "digest": "sha256:abc123def456...",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 942,
         "digest": "sha256:789ghi...",
         "platform": {
            "architecture": "arm64",
            "os": "linux",
            "variant": "v8"
         }
      }
   ]
}

Buildx 中的 imagetools

Buildx 提供的 imagetools 命令可以查看和操作远程镜像:

# 查看镜像的 manifest 信息
docker buildx imagetools inspect myapp:latest

# 更详细的输出
docker buildx imagetools inspect --raw myapp:latest

输出:

Name:      registry-1.docker.io/myapp:latest
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest:    sha256:xyz...

Manifests:
  linux/amd64  sha256:abc...
  linux/arm64  sha256:def...

验证多架构镜像

# 按平台查看 digest
docker buildx imagetools inspect myapp:latest | grep "linux/arm64"

# 提取特定平台的 manifest
docker buildx imagetools inspect --raw myapp:latest | jq '.manifests[] | select(.platform.architecture=="arm64")'

验证镜像签名

# 安装 cosign
cosign verify myapp:latest

# 查看签名
cosign verify-attestation myapp:latest

验证镜像内容

# 在特定架构上运行
docker run --platform linux/arm64 myapp:latest uname -m

# 查看镜像层信息
docker history myapp:latest

# 查看镜像配置
docker image inspect myapp:latest

常见验证场景

场景一:确认多架构构建成功

docker buildx imagetools inspect myapp:latest
# 确认列出了所有目标架构

场景二:比较不同版本的镜像

docker buildx imagetools inspect myapp:v1
docker buildx imagetools inspect myapp:v2
# 对比 digest 确认内容差异

场景三:镜像大小验证

docker buildx imagetools inspect myapp:latest | grep -E "linux/amd64|linux/arm64"
# 注意:不同架构的镜像大小可能不同

调试镜像问题

# 使用 dive 工具分析镜像层
dive myapp:latest

# 查看每层的大小
docker history myapp:latest --no-trunc

# 验证 manifest digest
docker manifest inspect myapp:latest | jq -r '.manifests[].digest'

面试要点

  1. docker manifest inspect 查看原始 manifest,buildx imagetools inspect 查看更友好的格式
  2. Manifest List 是多架构镜像的核心数据结构
  3. 通过 inspect 可以确认多架构构建是否覆盖了所有目标平台
  4. Digest(SHA256)是镜像的唯一标识,比 tag 更可靠
  5. 镜像签名验证是企业级安全的关键环节

面试官常问:如何验证一个镜像是否是多架构镜像?如何验证镜像没有被篡改?

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容