如何將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 或其他兼容的鏡像倉庫,核心邏輯分為兩步:
- 生成符合 Skopeo 要求的目錄結(jié)構(gòu)(
gen_skopeo_dir
函數(shù)) - 使用 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鏡像構(gòu)建之docker commit的使用
本文主要介紹了Docker鏡像構(gòu)建之docker commit的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04Jenkins構(gòu)建Docker鏡像并推送至Harbor倉庫的實現(xiàn)
本文主要介紹了Jenkins構(gòu)建Docker鏡像并推送至Harbor倉庫,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09