为何部分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
格式差异的核心原因
- 基础镜像的格式继承:你构建镜像时使用的基础镜像如果是OCI格式,新构建的镜像会默认沿用OCI格式,执行
docker save时就会输出OCI布局的tar包;反之如果基础镜像是Docker V2格式,导出的包也会对应旧结构。 - Docker daemon的默认配置:部分环境中Docker daemon可能被配置为默认使用OCI格式存储镜像,这会导致所有新构建的镜像都采用OCI格式。
- 镜像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
相关产品推荐
相关产品推荐

