工作笔记 · 2025年11月13日 0

harbor从1.7.5 升级至 2.14.0

背景

由于服务器的磁盘规划没有做好,挂载harbor镜像库的磁盘空间只有40G ,时间长,空间耗尽,带来的影响是 harbor无法登陆,外部无法推送镜像到harbor,harbor的镜像的db服务不断重启(这个应该是无法登陆的原因)

docker 1.18 ,对应 docker-compose 版本较低,无法运行 2.14harbor的安装脚本

升级到docker 以及 docker-compose后

在解压的 2.14 harbor文件夹

预先创建 harbor的registry 目录,并且挂靠大磁盘空间

修改 harbor.yml,执行 ./perpare 后执行 ./install.sh

安装完成后,有多个docker 容器启动

harbor的 1.7.5 的镜像如何迁移到新版本

先查看 1.7.5的 docker-compose.yaml 文件,确定harbor镜像资源目录

grep -A 10 "registry:" docker-compose.yml
docker run -d --name temp-registry -p 5000:5000 \
-v /data/registry:/var/lib/registry \ # 将 Harbor 的实际数据目录挂载到临时容器的默认路径
registry:2.6.2
# 查看临时容器中的镜像清单
curl http://localhost:5000/v2/_catalog
# 若返回镜像列表,说明路径正确,可继续用脚本导出
# 1. 重新生成镜像清单(基于正确的目录)
cd /data/registry/
find ./repositories -type f -path "*/_manifests/tags/*/current/link" | \
sed -n 's|./repositories/\(.*\)/_manifests/tags/\(.*\)/current/link|\1:\2|p' > old-harbor-images.list

# 2. 导出镜像(使用之前优化的脚本)
mkdir -p /tmp/old-images/
while read -r img; do
[ -z "${img}" ] && continue
temp_img="localhost:5000/${img}"
echo "正在拉取:${temp_img}"
if docker pull "${temp_img}"; then
tar_filename=$(echo "${img}" | tr '/' '-' | tr ':' '-' | tr ' ' '_').tar
tar_path="/tmp/old-images/${tar_filename}"
docker save -o "${tar_path}" "${temp_img}" && echo "✅ 导出成功:${tar_path}" && docker rmi "${temp_img}"
else
echo "❌ 拉取失败:${temp_img}"
fi
done < old-harbor-images.list
#!/bin/bash
set -euo pipefail

# 新版 Harbor 配置(替换为你的实际信息)
NEW_HARBOR="172.18.39.237" # 新版 Harbor 地址
HARBOR_USER="admin" # 新版 Harbor 用户名(需有项目推送权限)
HARBOR_PWD="Harbor12345" # 新版 Harbor 密码(替换为实际密码)

# 登录新版 Harbor
echo "登录新版 Harbor:${NEW_HARBOR}"
docker login "${NEW_HARBOR}" -u "${HARBOR_USER}" -p "${HARBOR_PWD}"

# 遍历 /tmp/old-images/ 目录下的所有tar文件
for tar_file in /tmp/old-images/*.tar; do
[ -f "${tar_file}" ] || continue # 跳过非文件

# 1. 加载tar文件到本地Docker
echo -e "\n===== 加载镜像:${tar_file} ====="
docker load -i "${tar_file}"

# 2. 提取原始镜像名(如 "localhost:5000/product/jnpf_jar:1.8")
# 通过 docker images 过滤出刚加载的镜像(基于tar文件名前缀)
tar_basename=$(basename "${tar_file}" .tar)
original_img=$(docker images --format "{{.Repository}}:{{.Tag}}" | grep "localhost:5000/.*${tar_basename}")

if [ -z "${original_img}" ]; then
echo "⚠️ 未找到与 ${tar_file} 匹配的镜像,跳过"
continue
fi

# 3. 生成新版 Harbor 的镜像标签(替换 localhost:5000 为新版地址)
# 例如:localhost:5000/product/jnpf_jar:1.8 → 172.18.39.237/product/jnpf_jar:1.8
new_img=$(echo "${original_img}" | sed "s|localhost:5000|${NEW_HARBOR}|")

# 4. 重新打标签
echo "重新打标签:${original_img} → ${new_img}"
docker tag "${original_img}" "${new_img}"

# 5. 推送到新版 Harbor
echo "推送镜像到新版 Harbor:${new_img}"
docker push "${new_img}"

# 6. 清理本地镜像(可选,节省空间)
docker rmi "${original_img}" "${new_img}"
done

echo -e "\n===== 所有镜像推送完成!====="

总结,通过上面的方法可以将1.7.5 的镜像资源无需启动旧版本的服务情况下完成迁移