如何将Docker Registry存储中的Docker镜像迁移到Harbor

 更新时间:2025年05月29日 09:24:14   作者:学亮编程手记  
这篇文章主要介绍了如何将Docker Registry存储中的Docker镜像迁移到Harbor问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Docker Registry存储的Docker镜像迁移到Harbor

#!/bin/bash
REGISTRY_PATH="/var/lib/registry"
REGISTRY_DOMAIN="${1}"
REGISTRY_USER="${2}"
REGISTRY_PWD="${3}"

# 切换到 registry 存储主目录下
cd ${REGISTRY_PATH}

gen_skopeo_dir() {
   # 定义 registry 存储的 blob 目录 和 repositories 目录,方便后面使用
    BLOB_DIR="docker/registry/v2/blobs/sha256"
    REPO_DIR="docker/registry/v2/repositories"
    # 定义生成 skopeo 目录
    SKOPEO_DIR="docker/skopeo"
    # 通过 find 出 current 文件夹可以得到所有带 tag 的镜像,因为一个 tag 对应一个 current 目录
    for image in $(find ${REPO_DIR} -type d -name "current"); do
        # 根据镜像的 tag 提取镜像的名字
        name=$(echo ${image} | awk -F '/' '{print $5"/"$6":"$9}')
        link=$(cat ${image}/link | sed 's/sha256://')
        mfs="${BLOB_DIR}/${link:0:2}/${link}/data"
        # 创建镜像的硬链接需要的目录
        mkdir -p "${SKOPEO_DIR}/${name}"
        # 硬链接镜像的 manifests 文件到目录的 manifest 文件
        ln -f ${mfs} ${SKOPEO_DIR}/${name}/manifest.json
        # 使用正则匹配出所有的 sha256 值,然后排序去重
        layers=$(grep -Eo "\b[a-f0-9]{64}\b" ${mfs} | sort -n | uniq)
        for layer in ${layers}; do
            # 硬链接 registry 存储目录里的镜像 layer 和 images config 到镜像的 dir 目录
            ln -f ${BLOB_DIR}/${layer:0:2}/${layer}/data ${SKOPEO_DIR}/${name}/${layer}
        done
    done
}

sync_image() {
    # 使用 skopeo sync 将 dir 格式的镜像同步到 harbor
    for project in $(ls ${SKOPEO_DIR}); do
        skopeo sync --insecure-policy --src-tls-verify=false --dest-tls-verify=false \
        --dest-creds ${REGISTRY_USER}:${REGISTRY_PWD} \
        --src dir --dest docker ${SKOPEO_DIR}/${project} ${REGISTRY_DOMAIN}
    done
}

gen_skopeo_dir
sync_image

该脚本用于将 Docker Registry 存储中的镜像迁移到 Harbor 或其他兼容的镜像仓库,核心逻辑分为两步:

  1. 生成符合 Skopeo 要求的目录结构gen_skopeo_dir 函数)
  2. 使用 Skopeo 同步镜像到目标仓库sync_image 函数)

逐段代码解析

1. 初始化参数与路径

REGISTRY_PATH="/var/lib/registry"  # Docker Registry 存储根目录
REGISTRY_DOMAIN="${1}"             # 目标 Harbor 域名(如 harbor.example.com)
REGISTRY_USER="${2}"               # Harbor 用户名
REGISTRY_PWD="${3}"                # Harbor 密码
  • 作用:接收用户输入的 Harbor 地址和认证信息,并指定 Registry 存储路径。

2. 生成 Skopeo 目录结构(gen_skopeo_dir)

BLOB_DIR="docker/registry/v2/blobs/sha256"  # 镜像 Blob 存储路径
REPO_DIR="docker/registry/v2/repositories"  # 镜像元数据存储路径
SKOPEO_DIR="docker/skopeo"                  # Skopeo 临时目录

for image in $(find ${REPO_DIR} -type d -name "current"); do
    name=$(echo ${image} | awk -F '/' '{print $5"/"$6":"$9}')  # 提取镜像名(格式:项目/镜像:标签)
    link=$(cat ${image}/link | sed 's/sha256://')               # 获取 Manifest 的 SHA256 值
    mfs="${BLOB_DIR}/${link:0:2}/${link}/data"                  # 定位 Manifest 文件路径
    mkdir -p "${SKOPEO_DIR}/${name}"                            # 创建镜像目录
    ln -f ${mfs} ${SKOPEO_DIR}/${name}/manifest.json           # 硬链接 Manifest 文件
    layers=$(grep -Eo "\b[a-f0-9]{64}\b" ${mfs} | sort -n | uniq)  # 提取所有 Layer SHA256
    for layer in ${layers}; do
        ln -f ${BLOB_DIR}/${layer:0:2}/${layer}/data ${SKOPEO_DIR}/${name}/${layer}  # 硬链接 Layer 文件
    done
done

核心功能

  • 遍历 Registry 存储目录中的每个镜像 Tag(通过 current 目录标识)。
  • 通过硬链接(ln -f)复用 Registry 存储中的 Blob 文件,避免磁盘复制开销。
  • 生成符合 Skopeo dir 格式的目录结构,包含 manifest.json 和 Layer 文件。

3. 同步镜像到 Harbor(sync_image)

for project in $(ls ${SKOPEO_DIR}); do
    skopeo sync --insecure-policy --src-tls-verify=false --dest-tls-verify=false \
    --dest-creds ${REGISTRY_USER}:${REGISTRY_PWD} \
    --src dir --dest docker ${SKOPEO_DIR}/${project} ${REGISTRY_DOMAIN}
done

核心功能

  • 使用 skopeo sync 命令将生成的 dir 格式镜像同步到 Harbor。
  • --dest-creds 指定 Harbor 的认证信息,--src-tls-verify=false 忽略源/目标的 TLS 验证(适用于非 HTTPS 或自签名证书环境)。
  • 按项目(Project)逐一批量同步镜像。

关键技术原理

硬链接优化

  • 直接通过文件系统硬链接复用 Registry 存储中的 Blob 文件,减少磁盘 I/O 和时间消耗。

Skopeo 目录格式

  • dir 格式是 Skopeo 支持的本地镜像存储格式,包含 manifest.json 和未压缩的 Layer 文件。

Harbor 兼容性

  • 适用于 Harbor 2.x 版本(需通过 API 推送镜像,直接复制存储目录已失效)。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Docker中搭建FastDFS文件系统(多图教程)

    Docker中搭建FastDFS文件系统(多图教程)

    这篇文章主要介绍了Docker中搭建FastDFS文件系统(多图教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • docker+jenkins+gitee配置持续集成部署方式

    docker+jenkins+gitee配置持续集成部署方式

    这篇文章主要介绍了docker+jenkins+gitee配置持续集成部署方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Docker开启远程安全访问的图文教程详解

    Docker开启远程安全访问的图文教程详解

    这篇文章主要介绍了Docker开启远程安全访问的详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • docker-compose管理容器network与ip问题

    docker-compose管理容器network与ip问题

    这篇文章主要介绍了docker-compose管理容器network与ip问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Dockerfile 指令 ADD 和 COPY介绍

    Dockerfile 指令 ADD 和 COPY介绍

    ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录、以及一个URL标记的文件 拷贝到镜像中,COPY指令和ADD指令功能和使用方式类似。只是COPY指令不会做自动解压工作。本文给大家介绍的非常详细,需要的朋友参考下
    2017-03-03
  • Docker 安装及配置镜像加速的实现

    Docker 安装及配置镜像加速的实现

    这篇文章主要介绍了Docker 安装及配置镜像加速的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 修改Docker默认存储路径的步骤详解

    修改Docker默认存储路径的步骤详解

    随着Docker技术的广泛应用,它极大地简化了复杂项目的部署与维护流程,仅凭单一镜像即可轻松运行,然而,随着数据量不断增长,Docker的默认数据存储方式可能逐渐成为挑战,本文给大家介绍了如何修改Docker默认存储路径,解决系统盘占用90%+问题,需要的朋友可以参考下
    2024-09-09
  • Docker 安装 Consul单机模式的操作方法

    Docker 安装 Consul单机模式的操作方法

    这篇文章主要介绍了Docker 安装 Consul单机模式,本文给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • Docker 限制容器对内存的使用详解

    Docker 限制容器对内存的使用详解

    这篇文章主要介绍了Docker 限制容器对内存的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Docker中查看kkFileView版本的五种实用方法全解析

    Docker中查看kkFileView版本的五种实用方法全解析

    本文给大家介绍在Docker环境中查看kkFileView服务版本的五种方法,包括进入容器查看、解析日志文件、检查容器内文件、利用dockerinspect命令和查询API,每种方法的步骤和适用场景都有详细说明,帮助用户快速准确地获取版本信息,感兴趣的朋友跟随小编一起看看吧
    2026-04-04

最新评论