如何从Nexus导出的Manifest与Blob文件构建Docker镜像
从Nexus导出的镜像文件重建Docker镜像
先明确你手里的文件逻辑:每个镜像的子文件夹里存着manifest.json(镜像核心清单)和config.json(镜像配置),blobs文件夹里的SHA命名文件就是镜像的层——本质是tar包,只是Nexus导出时没加后缀。下面分单镜像手动处理和多镜像批量处理两种方式:
单镜像手动重建
- 临时目录准备:新建一个临时文件夹,比如
/tmp/rebuild-nginx,把目标镜像子文件夹里的config.json、manifest.json复制进去。 - 复制对应层文件:打开
manifest.json,找到layers数组里的每个digest(格式是sha256:xxxxxx),把blobs文件夹里对应的xxxxxx文件复制到临时目录,并重命名为xxxxxx.tar.gz(Docker认这个后缀)。 - 生成repositories文件:在临时目录里新建
repositories文件,内容替换成你的镜像名和标签,比如:{ "nginx": { "1.24": "" } } - 打包并导入:进入临时目录,打包所有文件,再用docker load导入:
完成后用cd /tmp/rebuild-nginx tar -cvf nginx-1.24.tar ./* docker load -i nginx-1.24.tardocker images就能看到导入的镜像了。
多镜像批量处理(脚本方式)
如果有一堆镜像要处理,写个bash脚本自动搞定(需要先装jq用来解析JSON,apt/yum install jq就行):
#!/bin/bash # 替换成你的实际路径 BLOBS_PATH="./blobs" IMAGES_ROOT="./image-folders" # 遍历每个镜像文件夹 for img_dir in "$IMAGES_ROOT"/*; do [ -d "$img_dir" ] || continue img_name=$(basename "$img_dir") tmp_dir="/tmp/rebuild-$img_name" mkdir -p "$tmp_dir" # 复制配置和清单 cp "$img_dir"/config.json "$img_dir"/manifest.json "$tmp_dir"/ # 批量复制对应层文件 jq -r '.layers[].digest' "$img_dir"/manifest.json | while read digest; do blob_file="${digest#sha256:}" cp "$BLOBS_PATH"/"$blob_file" "$tmp_dir"/"$blob_file".tar.gz done # 生成repositories文件(默认用文件夹名做镜像名,标签设为latest,可自行修改) cat > "$tmp_dir"/repositories <<- EOF { "$img_name": { "latest": "" } } EOF # 打包导入 tar -cvf "$tmp_dir"/"$img_name".tar -C "$tmp_dir" . docker load -i "$tmp_dir"/"$img_name".tar # 清理临时文件 rm -rf "$tmp_dir" done
把脚本保存为rebuild-images.sh,给执行权限chmod +x rebuild-images.sh,直接运行就行。
注意事项
- 如果你的镜像是OCI格式(Nexus导出的大多是Docker V2格式),层的
mediaType可能不同,这时候不用改后缀,直接复制原文件就行,docker load能识别。 - 导入后一定要用
docker run测试下镜像能不能正常启动,避免层文件或清单有问题。
内容的提问来源于stack exchange,提问作者Robin Weitzel
相关产品推荐
相关产品推荐

