如何将docker-dir格式镜像转为docker-archive?求哈希计算方法
解答:docker-dir转docker-archive的哈希计算与转换工具
一、哈希文件夹的计算规则
你看到的933bb35f5710a7515f24e7a4a8e8c6ca45a26a9c6590be5514e4af1f8dd56da1这类文件夹名称,是对应层元数据JSON内容的完整SHA256哈希值,具体计算步骤如下:
- 提取层信息:从
docker-dir目录下的manifest.json中,获取各层的顺序、层哈希(如示例中的80098e3d304cd7858ad97b310cd16083fbe6fab2968be7a988fc6894cb85dc25),以及镜像的基础配置(如操作系统、架构、创建时间等)。 - 生成层元数据JSON:为每个层生成对应的元数据JSON,结构示例如下(基础层无
parent字段,非基础层需指定父层的哈希文件夹名):{ "id": "生成的SHA256哈希值", "created": "2024-05-20T18:21:53.000Z", "container_config": { "Cmd": ["/bin/sh", "-c", "#(nop) ", "CMD [\"/bin/bash\"]"], "Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"], "Image": "sha256:xxxxxx", "Labels": {} }, "os": "linux", "architecture": "amd64" } - 计算哈希:将上述JSON内容压缩为无空格、无换行的单行字符串,然后计算其SHA256哈希值,这个值就是文件夹的名称,同时要填入JSON的
id字段中。 - 生成文件夹内容:每个哈希文件夹下需要创建三个文件:
json:保存上述格式化后的元数据JSONlayer.tar:创建指向对应层tar文件的软链接(如../80098e3d...tar)VERSION:文件内容固定为1.0
二、现成转换工具
不需要手动写脚本,直接用skopeo工具即可完成格式转换,步骤如下:
- 安装
skopeo(多数Linux发行版可通过包管理器安装,如apt install skopeo或dnf install skopeo) - 执行转换命令:
skopeo copy dir:///绝对路径/ubuntu-docker-dir docker-archive:///绝对路径/ubuntu-docker-archive.tar.gz
如果没有skopeo,也可以通过Podman间接转换:
# 将docker-dir镜像导入本地容器存储 skopeo copy dir:///绝对路径/ubuntu-docker-dir containers-storage:localhost/ubuntu:temp # 导出为docker-archive格式 podman save -o ubuntu-docker-archive.tar.gz --format docker-archive localhost/ubuntu:temp
内容的提问来源于stack exchange,提问作者John Stanford
相关产品推荐
相关产品推荐

