如何將Docker Registry存儲(chǔ)中的Docker鏡像遷移到Harbor
Docker Registry存儲(chǔ)的Docker鏡像遷移到Harbor
#!/bin/bash
REGISTRY_PATH="/var/lib/registry"
REGISTRY_DOMAIN="${1}"
REGISTRY_USER="${2}"
REGISTRY_PWD="${3}"
# 切換到 registry 存儲(chǔ)主目錄下
cd ${REGISTRY_PATH}
gen_skopeo_dir() {
# 定義 registry 存儲(chǔ)的 blob 目錄 和 repositories 目錄,方便后面使用
BLOB_DIR="docker/registry/v2/blobs/sha256"
REPO_DIR="docker/registry/v2/repositories"
# 定義生成 skopeo 目錄
SKOPEO_DIR="docker/skopeo"
# 通過 find 出 current 文件夾可以得到所有帶 tag 的鏡像,因?yàn)橐粋€(gè) tag 對(duì)應(yīng)一個(gè) 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 存儲(chǔ)目錄里的鏡像 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 存儲(chǔ)中的鏡像遷移到 Harbor 或其他兼容的鏡像倉(cāng)庫(kù),核心邏輯分為兩步:
- 生成符合 Skopeo 要求的目錄結(jié)構(gòu)(
gen_skopeo_dir函數(shù)) - 使用 Skopeo 同步鏡像到目標(biāo)倉(cāng)庫(kù)(
sync_image函數(shù))
逐段代碼解析
1. 初始化參數(shù)與路徑
REGISTRY_PATH="/var/lib/registry" # Docker Registry 存儲(chǔ)根目錄
REGISTRY_DOMAIN="${1}" # 目標(biāo) Harbor 域名(如 harbor.example.com)
REGISTRY_USER="${2}" # Harbor 用戶名
REGISTRY_PWD="${3}" # Harbor 密碼- 作用:接收用戶輸入的 Harbor 地址和認(rèn)證信息,并指定 Registry 存儲(chǔ)路徑。
2. 生成 Skopeo 目錄結(jié)構(gòu)(gen_skopeo_dir)
BLOB_DIR="docker/registry/v2/blobs/sha256" # 鏡像 Blob 存儲(chǔ)路徑
REPO_DIR="docker/registry/v2/repositories" # 鏡像元數(shù)據(jù)存儲(chǔ)路徑
SKOPEO_DIR="docker/skopeo" # Skopeo 臨時(shí)目錄
for image in $(find ${REPO_DIR} -type d -name "current"); do
name=$(echo ${image} | awk -F '/' '{print $5"/"$6":"$9}') # 提取鏡像名(格式:項(xiàng)目/鏡像:標(biāo)簽)
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 存儲(chǔ)目錄中的每個(gè)鏡像 Tag(通過
current目錄標(biāo)識(shí))。 - 通過硬鏈接(
ln -f)復(fù)用 Registry 存儲(chǔ)中的 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 的認(rèn)證信息,--src-tls-verify=false忽略源/目標(biāo)的 TLS 驗(yàn)證(適用于非 HTTPS 或自簽名證書環(huán)境)。- 按項(xiàng)目(Project)逐一批量同步鏡像。
關(guān)鍵技術(shù)原理
硬鏈接優(yōu)化:
- 直接通過文件系統(tǒng)硬鏈接復(fù)用 Registry 存儲(chǔ)中的 Blob 文件,減少磁盤 I/O 和時(shí)間消耗。
Skopeo 目錄格式:
dir格式是 Skopeo 支持的本地鏡像存儲(chǔ)格式,包含manifest.json和未壓縮的 Layer 文件。
Harbor 兼容性:
- 適用于 Harbor 2.x 版本(需通過 API 推送鏡像,直接復(fù)制存儲(chǔ)目錄已失效)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決docker容器與宿主機(jī)相差8小時(shí)的問題
使用docker-compose部署時(shí),在輸出的日志以及相關(guān)事件校驗(yàn)及輸出時(shí),導(dǎo)致事件與現(xiàn)實(shí)相差8小時(shí)。糾結(jié)怎么回事呢?下面小編給大家分享下解決docker容器與宿主機(jī)相差8小時(shí)的問題,一起看看吧2021-09-09
Docker 數(shù)據(jù)存儲(chǔ)路徑之解決默認(rèn)docker路徑位置磁盤空間不足的問題
本文指導(dǎo)如何通過修改daemon.json將Docker數(shù)據(jù)目錄從/var/lib/docker遷移至/mnt/disk/docker,保留所有鏡像、容器等數(shù)據(jù),無需調(diào)整docker.service,步驟包括停止服務(wù)、遷移數(shù)據(jù)、修改配置及重啟驗(yàn)證,需要的朋友跟隨小編一起學(xué)習(xí)吧2025-08-08
Windows安裝docker-desktop的詳細(xì)步驟
這篇文章主要介紹了Windows安裝docker-desktop的詳細(xì)步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-03-03
docker自建rustdesk-server遠(yuǎn)程桌面的解決方案
RustDesk 是一款可以平替 TeamViewer 的開源軟件,旨在提供安全便捷的自建方案,這篇文章主要介紹了docker自建rustdesk-server遠(yuǎn)程桌面的解決方案,需要的朋友可以參考下2024-07-07
如何使用Docker部署briefing視頻聊天系統(tǒng)
briefing是一個(gè)開源的、安全的直接視頻群聊平臺(tái),這篇文章主要介紹了使用Docker部署briefing視頻聊天系統(tǒng)的詳細(xì)過程,需要的朋友可以參考下2024-01-01
Docker 數(shù)據(jù)卷及數(shù)據(jù)容器詳細(xì)介紹及示例
這篇文章主要介紹了Docker 數(shù)據(jù)卷及數(shù)據(jù)容器詳細(xì)介紹及示例的相關(guān)資料,Docker 很強(qiáng)大,不僅部署維護(hù)提高效率,docker和宿主之間的數(shù)據(jù)共享以及docker間的數(shù)據(jù)共享需要好好研究一下,需要的朋友可以參考下2016-11-11

