硕果树 Logo
首页
关于
登录 →
硕果树 Logo
首页 关于
登录
  1. 首页
  2. 知识
  3. Harbor镜像库页面如何误删恢复

Harbor镜像库页面如何误删恢复

0
  • 知识
  • 发布于 2025-02-11
  • 24 次阅读
Yeqi
Yeqi

概述

起因是开发者在生产环境的harbor中操作时,需要删除测试环境的harbor镜像来清理空间,不小心把生产环境的镜像全部删除。

故而需要探究harbor镜像仓库的镜像恢复思路。

分析

本来很绝望,但是看到清理服务中还能模拟清理(不要点成真的清理了)600G的缓存,我就知道数据还有救。

要第一时间点击清理服务,把里面的定时清理关掉。

然后在harbor的数据文件中可以找到

{harbor数据根目录}/registry/docker/registry/v2

repositories存着镜像的索引信息。

blobs存着镜像索引对应的层文件。

在页面中删除镜像后,不触发清理服务,他们的文件是不会删除的,所以页面只是逻辑删除。

指导文件还在,心里石头落地一半,查阅资料后,发现这些文件的恢复方式如下:

在repositories文件夹里,找对想要恢复的镜像的项目文件夹,可以找到一大堆以镜像名命名的文件夹。

找到想要恢复的镜像名对应的文件夹,里面有_manifests/tags
找到对应标签的文件夹找到link文件

tags/latest/current/link

里面写着的id就是这个镜像的层结构,可以在blobs里找到他,读取出来就是一个可读的json文件,里面记录着镜像有多少层,每层的blobs文件是什么。

这样我们就能通过将这些文件还原成tar包,再通过docker load来加载回来了。

恢复脚本

#!/bin/bash

set -e

# 检查参数
if [ "$#" -ne 1 ]; then
  echo "Usage: $0 <image_name:tag>"
  exit 1
fi

# 设置镜像名和标签参数
IMAGE_NAME_WITH_TAG=$1
IMAGE_NAME=${IMAGE_NAME_WITH_TAG%:*}  # 去掉最后的标签
TAG=${IMAGE_NAME_WITH_TAG##*:}  # 获取标签

# 配置工作目录和目标路径
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
HARBOR_DIR="/data/harbor/registry/docker/registry/v2"
REPO_DIR="$HARBOR_DIR/repositories/$IMAGE_NAME"
BLOB_ROOT_DIR="$HARBOR_DIR/blobs"
WORK_DIR="$SCRIPT_DIR/restore_image"
BACKUP_DIR="$SCRIPT_DIR/backup_harbor"
TAR_FILE="$BACKUP_DIR/restored_image.tar"

# 清理临时目录
rm -rf "${WORK_DIR}"
mkdir -p "${WORK_DIR}"

# 获取最新 manifest link
MANIFEST_LINK=$(cat "${REPO_DIR}/_manifests/tags/$TAG/current/link")
MANIFEST_DIGEST=${MANIFEST_LINK#sha256:}
MANIFEST_FILE="${BLOB_ROOT_DIR}/sha256/${MANIFEST_DIGEST:0:2}/${MANIFEST_DIGEST}/data"

# 提取 manifest 内容
MANIFEST_CONTENT=$(cat "${MANIFEST_FILE}")
echo "${MANIFEST_CONTENT}" > "${WORK_DIR}/manifest.json"

# 提取 config blob
CONFIG_DIGEST=$(echo "${MANIFEST_CONTENT}" | jq -r '.config.digest')
CONFIG_HASH=${CONFIG_DIGEST#sha256:}
CONFIG_FILE="${BLOB_ROOT_DIR}/sha256/${CONFIG_HASH:0:2}/${CONFIG_HASH}/data"
if [ ! -f "${CONFIG_FILE}" ]; then
  echo "Error: Cannot find config file: ${CONFIG_FILE}"
  exit 1
fi
cp "${CONFIG_FILE}" "${WORK_DIR}/config.json"

# 提取 layers blobs
LAYER_IDX=1
LAYERS=()
for LAYER_DIGEST in $(echo "${MANIFEST_CONTENT}" | jq -r '.layers[].digest'); do
  LAYER_HASH=${LAYER_DIGEST#sha256:}
  LAYER_FILE="${BLOB_ROOT_DIR}/sha256/${LAYER_HASH:0:2}/${LAYER_HASH}/data"
  if [ ! -f "${LAYER_FILE}" ]; then
    echo "Error: Cannot find layer file: ${LAYER_FILE}"
    exit 1
  fi
  LAYER_NAME="layer${LAYER_IDX}.tar"
  cp "${LAYER_FILE}" "${WORK_DIR}/${LAYER_NAME}"
  LAYERS+=("${LAYER_NAME}")
  ((LAYER_IDX++))
done

# 构造 manifest.json
LAYERS_JSON=$(printf '"%s", ' "${LAYERS[@]}" | sed 's/, $//')
cat <<EOF > "${WORK_DIR}/manifest.json"
[
  {
    "Config": "config.json",
    "RepoTags": ["nm01.registry.meta-blue.com/$IMAGE_NAME:$TAG"],
    "Layers": [
      ${LAYERS_JSON}
    ]
  }
]
EOF

# 打包成 tar 文件
mkdir -p "${BACKUP_DIR}"
tar -cvf "${TAR_FILE}" -C "${WORK_DIR}" .

echo "镜像 tar包已打包完成,路径位置:${TAR_FILE},现在进行 docker load 导入"

# Docker导入镜像
LOADED_IMAGE_ID=$(docker load -i "${TAR_FILE}" | awk '/Loaded image/{print $3}')
docker tag "${LOADED_IMAGE_ID}" "nm01.registry.meta-blue.com/$IMAGE_NAME:$TAG"
docker push "nm01.registry.meta-blue.com/$IMAGE_NAME:$TAG"

# 删除本地镜像
docker rmi "${LOADED_IMAGE_ID}"

# 清理临时文件
rm -rf "${WORK_DIR}"
rm -rf "${BACKUP_DIR}"

echo "镜像成功导入并推送到Harbor,并已清理缓存和本地镜像:${TAR_FILE}"

标签: #Harbor 1 #镜像 1 #误操作 1 #恢复 1
相关文章
打开程序世界大门

打开程序世界大门 2024-12-05 17:50

概述 本知识树带您进入程序世界的大门,0基础拥有程序世界观。 目录 编程是什么 1-1-1编程的定义 1-1-2编程的历史

Harbor镜像库页面如何误删恢复

Harbor镜像库页面如何误删恢复 2025-02-11 16:08

概述 起因是开发者在生产环境的harbor中操作时,需要删除测试环境的harbor镜像来清理空间,不小心把生产环境的镜像全部删除。 故而需要探究harbor镜像仓库的镜像恢复思路。 分析 本来很绝望,但是看到清理服务中还能模拟清理(不要点成真的清理了)600G的缓存,我就知道数据还有救。 要第一时间

注释

注释 2024-12-07 02:12

内容 什么是注释? 注释(Comments)是编程代码中的说明性文字,用于解释代码的功能、逻辑或重要部分。 注释不会被计算机执行,它们只是为了帮助程序员理解和维护代码。 在代码中添加注释可以提高代码的可读性和可维护性,尤其在团队合作或长期项目中尤为重要。

操作符引发的疑惑与思考

操作符引发的疑惑与思考 2024-12-05 19:00

内容 不用多说,所有操作符都要记住,值得注意的是,每个语言的具体形式有所不同,忘掉他们具体的体现形式,记住他的内在逻辑。 如果你还有疑惑,我猜你可能根本不知道运算符到底是干啥的,其实就是两个数据之间做运算后返回一个结果给你 比如

操作符优先级

操作符优先级 2024-12-05 19:00

内容 括号 (): 用于明确指明运算的顺序,优先级最高。 指数/幂运算 **: 结合性:右结合 例如:在Python中,a b c等同于a (b c) 正负号运算符 + - (一元加、一元减): 结合性:右结合 用于表示数值的正负。

逻辑操作符

逻辑操作符 2024-12-05 18:57

内容 逻辑操作符用于连接或反转布尔表达式,并且可用于复杂条件的构建。常见的逻辑操作符包括: 逻辑与(AND,通常用 && 或 and) : 当且仅当两个操作数都为true,结果才为true。 例如:a && b 或 a and b 逻辑或(OR,通常用 || 或 or)<

目录
京ICP备2024082087号
gongan beian 京公网安备11011402054333号