You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何部分Docker镜像含layer.tar文件,部分为二进制Blob层?

Docker Save 生成镜像包结构差异的原因

你遇到的情况是因为Docker支持两种不同的镜像存储/导出格式,即使使用同一版本Docker执行相同的docker build和docker save命令,也会因镜像本身的格式属性输出不同结构的tar包:

两种镜像格式的直观差异

第一种是Docker V2.2原生格式,解压后结构如下:

.
├── 002dd465768a1e98e3ed60c93a146544b126c08c9698ec21e5c2278cdc0da9b2
│   ├── VERSION
│   ├── json
│   └── layer.tar
├── 0fe7348ffe3808506392a882b1a169e31b567b0ea6a74030fca23d122666bd2b
│   ├── VERSION
│   ├── json
│   └── layer.tar
├── 1fb1a002b9e7b38da24e7382886b35027836caf8e51dc7f3b2561ef02d4a77a3.json
├── manifest.json
└── repositories

第二种是OCI(开放容器倡议)标准格式,解压后结构为:

.
├── blobs
│   └── sha256
│       ├── 05f925e80df95fd593f4294e1a1b37a8e3a46de297ff47530a3fe7594cd41e24
│       ├── 070bff1412567be65814c47fde966b864de43ab541075bcdcf66135ecde7d916
│       
├── index.json
├── manifest.json
├── oci-layout
└── repositories

格式差异的核心原因

  1. 基础镜像的格式继承:你构建镜像时使用的基础镜像如果是OCI格式,新构建的镜像会默认沿用OCI格式,执行docker save时就会输出OCI布局的tar包;反之如果基础镜像是Docker V2格式,导出的包也会对应旧结构。
  2. Docker daemon的默认配置:部分环境中Docker daemon可能被配置为默认使用OCI格式存储镜像,这会导致所有新构建的镜像都采用OCI格式。
  3. 镜像Manifest类型:Docker镜像的manifest文件定义了镜像的格式类型,OCI镜像的manifest对应OCI标准的布局结构,docker save会根据manifest类型选择导出的包结构。

处理方案

  • 查看OCI格式的层内容:OCI格式的blob文件本质是gzip压缩的tar包(只是没有.tar.gz后缀),可以直接用tar命令解压查看:
    # 查看某个blob的文件列表
    tar tf blobs/sha256/05f925e80df95fd593f4294e1a1b37a8e3a46de297ff47530a3fe7594cd41e24
    # 解压blob到本地目录
    tar xf blobs/sha256/05f925e80df95fd593f4294e1a1b37a8e3a46de297ff47530a3fe7594cd41e24 -C ./layer-content
    
  • 强制生成Docker V2格式包:构建时通过--output参数指定输出格式为Docker原生格式,无需再执行docker save:
    docker build -t image_name:image_tag --output type=docker,dest=image_name.tar ./
    
    这样生成的image_name.tar解压后就是你熟悉的带layer.tar的结构。

内容的提问来源于stack exchange,提问作者Joel Godfrey-Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 22:07:43