正文
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