欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何將Docker Registry存儲中的Docker鏡像遷移到Harbor

 更新時間:2025年05月29日 09:24:14   作者:學(xué)亮編程手記  
這篇文章主要介紹了如何將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 對應(yīng)一個 current 目錄
    for image in $(find ${REPO_DIR} -type d -name "current"); do
        # 根據(jù)鏡像的 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"
        # 創(chuàng)建鏡像的硬鏈接需要的目錄
        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 要求的目錄結(jié)構(gòu)gen_skopeo_dir 函數(shù))
  2. 使用 Skopeo 同步鏡像到目標倉庫sync_image 函數(shù))

逐段代碼解析

1. 初始化參數(shù)與路徑

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 目錄結(jié)構(gòu)(gen_skopeo_dir)

BLOB_DIR="docker/registry/v2/blobs/sha256"  # 鏡像 Blob 存儲路徑
REPO_DIR="docker/registry/v2/repositories"  # 鏡像元數(shù)據(jù)存儲路徑
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}"                            # 創(chuàng)建鏡像目錄
    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)復(fù)用 Registry 存儲中的 Blob 文件,避免磁盤復(fù)制開銷。
  • 生成符合 Skopeo dir 格式的目錄結(jié)構(gòu),包含 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 或自簽名證書環(huán)境)。
  • 按項目(Project)逐一批量同步鏡像。

關(guān)鍵技術(shù)原理

硬鏈接優(yōu)化

  • 直接通過文件系統(tǒng)硬鏈接復(fù)用 Registry 存儲中的 Blob 文件,減少磁盤 I/O 和時間消耗。

Skopeo 目錄格式

  • dir 格式是 Skopeo 支持的本地鏡像存儲格式,包含 manifest.json 和未壓縮的 Layer 文件。

Harbor 兼容性

  • 適用于 Harbor 2.x 版本(需通過 API 推送鏡像,直接復(fù)制存儲目錄已失效)。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談docker容器鏡像的保存位置

    淺談docker容器鏡像的保存位置

    在使用Docker時,我們常常需要從遠程倉庫中拉取鏡像,并將其保存到本地儲存位置,本文主要介紹了淺談docker容器鏡像的保存位置,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • docker引起服務(wù)器磁盤爆滿的問題解決

    docker引起服務(wù)器磁盤爆滿的問題解決

    本文主要介紹了docker引起服務(wù)器磁盤爆滿的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • docker部署LNMP架構(gòu)的方法

    docker部署LNMP架構(gòu)的方法

    這篇文章主要介紹了docker部署LNMP架構(gòu)的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 使用Dockerfile制作jdk鏡像的詳細教程

    使用Dockerfile制作jdk鏡像的詳細教程

    在Docker的世界里,Dockerfile是一個至關(guān)重要的文本文件,它定義了如何構(gòu)建Docker鏡像,通過編寫Dockerfile,開發(fā)者可以確保他們的應(yīng)用程序及其依賴項被正確地打包、優(yōu)化和部署,本文將深入探討Dockerfile的組成、常用指令以及編寫高效Dockerfile的最佳實踐
    2024-12-12
  • 在Docker上安裝配置Oracle教程

    在Docker上安裝配置Oracle教程

    本篇文章主要介紹了在 Docker 上配置 Oracle教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • 如何在Docker中部署運行jar

    如何在Docker中部署運行jar

    這篇文章主要介紹了如何在Docker中部署運行jar問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Docker鏡像構(gòu)建之docker commit的使用

    Docker鏡像構(gòu)建之docker commit的使用

    本文主要介紹了Docker鏡像構(gòu)建之docker commit的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Jenkins構(gòu)建Docker鏡像并推送至Harbor倉庫的實現(xiàn)

    Jenkins構(gòu)建Docker鏡像并推送至Harbor倉庫的實現(xiàn)

    本文主要介紹了Jenkins構(gòu)建Docker鏡像并推送至Harbor倉庫,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • docker 無法釋放端口的解決方案

    docker 無法釋放端口的解決方案

    這篇文章主要介紹了docker 無法釋放端口的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • docker中間件部署超詳細步驟

    docker中間件部署超詳細步驟

    docker是現(xiàn)在很火的一項容器技術(shù),能夠幫助來部署我們來快速部署各類環(huán)境,這篇文章主要介紹了docker中間件部署的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03

最新評論