Harbor的逻辑备份与学习

发布时间 2023-09-28 23:45:51作者: 济南小老虎

Harbor的逻辑备份与学习


背景

一直想处理一下一个有网络冲突的Harbor镜像服务器
但是因为网络层自己水平一直是不是非常自信
加上Harbor容器使用的compose的玩法, 自己不敢直接处理. 

所以想着至少能够备份一下Harbor仓库内的镜像. 
冷备方式不用说了, 想着处理一下逻辑备份. 

正好看到了 51cto里面一个高手的文档, 自己正好拿来验证一下. 

学习来源自:
https://blog.51cto.com/lidabai
感谢原作者, 这里仅是进行一下简单的演绎. 

版本确认

curl -s http://192.168.xxx.xx/api/version

现在一般都是 2.0的版本了 返回的结果一般为:

{"version":"v2.0"}

使用shell脚本获取镜像列表信息

Harbor_Address=http://192.168.xxx.xx       #Harbor主机地址
Harbor_Pulltag=192.168.xxx.xx:80
Harbor_User=admin                      #登录Harbor的用户
Harbor_Passwd=HarborPassword              #登录Harbor的用户密码
Images_File=ImageInHarbor-`date '+%Y-%m-%d'`.txt   # 镜像清单文件
echo "" > $Images_File
Tar_File=/backup/Harbor-backup/                 #镜像tar包存放路径
# set -x
# 注意可以关闭 set -x 不然会出现非常多的调试信息. 
# 获取Harbor中所有的项目(Projects)
Project_List=$(curl -s -u $Harbor_User:$Harbor_Passwd  -H "Content-Type: application/json" -X GET  $Harbor_Address/api/v2.0/projects  -k  | python -m json.tool | grep name | awk '/"name": /' | awk -F '"' '{print $4}')

for Project in $Project_List;do
   # 循环获取项目下所有的镜像
    Image_Names=$(curl -u $Harbor_User:$Harbor_Passwd  -H "Content-Type: application/json" -X GET $Harbor_Address/api/v2.0/projects/$Project/repositories -k | python -m json.tool | grep name | awk '/"name": /' | awk -F '"' '{print $4}')
    for Image in $Image_Names;do
        # 循环获取镜像的版本(tag)
        Image_Tags=$(curl -u $Harbor_User:$Harbor_Passwd   -H "Content-Type: application/json"   -X GET  $Harbor_Address/v2/$Image/tags/list  -k |  awk -F '"'  '{print $8,$10,$12}')
        for Tag in $Image_Tags;do
            # 格式化输出镜像信息
            echo "$Harbor_Pulltag/$Image:$Tag"   >> $Images_File
        done
    done
done

转储所有镜像

#!/bin/bash
Harbor_Address=http://192.168.xxx.xx       #Harbor主机地址
Harbor_Pulltag=192.168.xxx.xx:80
Harbor_User=admin                      #登录Harbor的用户
Harbor_Passwd=HarborPassword              #登录Harbor的用户密码
Images_File=ImageInHarbor-`date '+%Y-%m-%d'`.txt   # 镜像清单文件
echo " " > $Images_File
Tar_File=/data/Harbor-backup    #镜像tar包存放路径
mkdir -p $Tar_File
# set -x
# 获取Harbor中所有的项目(Projects)
Project_List=$(curl -u $Harbor_User:$Harbor_Passwd  -H "Content-Type: application/json" -X GET  $Harbor_Address/api/v2.0/projects  -k  | python -m json.tool | grep name | awk '/"name": /' | awk -F '"' '{print $4}')

for Project in $Project_List;do
    mkdir -p ${Tar_File}/${Project}
   # 循环获取项目下所有的镜像
    Image_Names=$(curl -u $Harbor_User:$Harbor_Passwd  -H "Content-Type: application/json" -X GET $Harbor_Address/api/v2.0/projects/$Project/repositories -k | python -m json.tool | grep name | awk '/"name": /' | awk -F '"' '{print $4}')
    for Image in $Image_Names;do
        # 循环获取镜像的版本(tag)
        Image_Tags=$(curl -u $Harbor_User:$Harbor_Passwd   -H "Content-Type: application/json"   -X GET  $Harbor_Address/v2/$Image/tags/list  -k |  awk -F '"'  '{print $8,$10,$12}')
        for Tag in $Image_Tags;do
        docker pull  "$Harbor_Pulltag/$Image:$Tag"
        mkdir -p ${Tar_File}/${Image}
        docker save  "$Harbor_Pulltag/$Image:$Tag" |gzip > ${Tar_File}/${Image}.${Tag}.tar.gz
        # 直接修改为导出镜像 并且进行压缩
        done
    done
done

仅转储最大tag编号的镜像

  • 需要主要, 这个里面存在风险, 必须保证镜像tag的顺序递增才有效果
#!/bin/bash
Harbor_Address=http://192.168.xxx.xx       #Harbor主机地址
Harbor_Pulltag=192.168.xxx.xx:80
Harbor_User=admin                      #登录Harbor的用户
Harbor_Passwd=HarborPassword              #登录Harbor的用户密码
Images_File=ImageInHarbor-`date '+%Y-%m-%d'`.txt   # 镜像清单文件
echo " " > $Images_File
Tar_File=/data/Harbor-backup_new   #镜像tar包存放路径
mkdir -p $Tar_File
#set -x
# 获取Harbor中所有的项目(Projects)
Project_List=$(curl -s -u $Harbor_User:$Harbor_Passwd  -H "Content-Type: application/json" -X GET  $Harbor_Address/api/v2.0/projects  -k  | python -m json.tool | grep name | awk '/"name": /' | awk -F '"' '{print $4}')

for Project in $Project_List;do
   # 循环获取项目下所有的镜像
    mkdir -p ${Tar_File}/${Project}
    Image_Names=$(curl -s -u $Harbor_User:$Harbor_Passwd  -H "Content-Type: application/json" -X GET $Harbor_Address/api/v2.0/projects/$Project/repositories -k | python -m json.tool | grep name | awk '/"name": /' | awk -F '"' '{print $4}')
    for Image in $Image_Names;do
        # 循环获取镜像的版本(tag)
        Image_Tags=$(curl -s -u $Harbor_User:$Harbor_Passwd   -H "Content-Type: application/json"   -X GET  $Harbor_Address/v2/$Image/tags/list  -k |  awk -F '"'  '{print $8,$10,$12}')
        Tag=$(echo $Image_Tags |sort |awk '{print $NF}')
        docker pull  "$Harbor_Pulltag/$Image:$Tag"
        docker save  "$Harbor_Pulltag/$Image:$Tag" |gzip > ${Tar_File}/${Image}.${Tag}.tar.gz
    done
done