Harbor镜像仓库的导出与整理之二

harbor,镜像,仓库,导出,整理,之二 · 浏览次数 : 4

小编点评

**背景** 当获取和导出 Harbor 镜像时,发现镜像仓库中的镜像数量很多,却导出和列表里面的镜像却很少。 **问题** 由于 Harbor v2.0 API 的限制,每次 api 的返回结果最多是 100 个项目,默认值是 10 个。当项目数量超过 100 个时, page_size 设置的值就会影响结果。 **解决方法** 1. 使用 page2的方式进行处理。 2. 设置 curl 的项目信息,包括 page_size。 3. 使用正则表达式匹配镜像名称。 4. 使用条件语句进行筛选。 **代码** ```python import json import subprocess # 获取 Harbor 项目列表 url = "http://192.168.xxx.xx/api/v2.0/projects?page_size=100" response = subprocess.get(url, headers={"Content-Type": "application/json"}) projects = json.loads(response.text) # 获取每个项目的镜像信息 for project in projects: image_names = [] image_tags = [] url = "http://192.168.xxx.xx/api/v2.0/projects/%s/repositories/repositories?page_size=100" % project response = subprocess.get(url, headers={"Content-Type": "application/json"}) for image in response.json(): image_names.append(image["name"]) image_tags.append(image["tag"]) # 保存镜像 for i, image in enumerate(image_names): image_tag = image_tags[i] docker_image_name = "%s_%s.tar.gz" % (project, image_tag) docker_image_path = os.path.join(project, image_tag) docker.images.pull(image_tag, docker_image_name) docker.images.save(docker_image_path, f"{image_tag}.tar.gz") ``` **其他提示** * 可以使用 `docker ps -a` 命令检查镜像列表中哪些镜像处于 "running" 状态。 * 可以使用 `docker pull` 命令手动下载镜像。 * 可以使用 `docker save` 命令将镜像保存到本地目录中。

正文

Harbor镜像仓库的导出与整理之二


背景

前几天参照大神的blog进行了一下harbor的镜像列表的获取与下载.
当时发现一个很诡异的问题. 
实际上镜像仓库里面的镜像很多.
但是导出和列表里面的却很少.

经过查询发现harbor的v2.0的API里面存在一些限制.
每次api的返回结果最多是 100 个项目. 
默认值是10个. 
所以理论上他的数值就是 projects * 10 的最大值.

这个与项目的需求和场景是严重不符合的. 

所以查询了下方式方法进行了一下改进. 

curl的参数有配置

curl 能够设置项目信息等. 但是发现, 这个里面其实还是存在坑的. 
尤其是需要注意 & 等特殊符号的处理. 

curl -s -u 'admin:harborpassword' --limit-rate 1M -H 'Content-Type: application/json' \
-X GET http://192.168.xxx.xx/api/v2.0/projects/erp/repositories?page_size=100 -k \
| python -m json.tool | grep name | awk '/"name": /' | awk -F '"' '{print $4}' |wc -l

能够法相这个project 下面其实是有 98个 镜像的. 
然后可以使用这个命令进行一下获取. 如果某个项目超过了 98 最好是需要使用 page2的方式进行处理

curl -s -u 'admin:harborpassword' --limit-rate 1M -H 'Content-Type: application/json' \
-X GET http://192.168.xxx.xx/api/v2.0/projects/someProject/repositories/repositories?page_size=50\&page=2 -k \
| python -m json.tool | grep name | awk '/"name": /' | awk -F '"' '{print $4}' |wc -l

注意 如果是多个条件, 需要 & 前面增加反斜线进行分割. 
我改为 50的pagesize 第二页就会有 48个镜像. 问题是可控的

导出最新的镜像

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?page_size=100   -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?page_size=100  -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?page_size=100  -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

镜像文件太多时的留存策略

同事这边给出过一个处理方式.
我这边东施效颦一下进行一下简单总结

Harbor其实是有一个基本的留存策略的
可以保证每个项目仅保留部分镜像信息. 

具体的方法为:

admin 登录harbor 
->打开 项目
->选择最大磁盘空间的项目
->选中项目的 tag retention 或者是中文 策略 标签页
->选中tag保留
->操作,编辑后者是新增策略 输入
->以artifact 数量或者是天数为条件
->保留最近推送的#个镜像, 输入个数为5 或这个特性需要的个数. 
->保留
->运行 或者是 模拟运行. 
->可以设置定时执行, 比如每周执行一次. 

验证镜像容量就会出现了很大的缩小. 

需要注意 可能还需要执行一次->系统管理->垃圾清理

与Harbor镜像仓库的导出与整理之二相似的内容:

Harbor镜像仓库的导出与整理之二

Harbor镜像仓库的导出与整理之二 背景 前几天参照大神的blog进行了一下harbor的镜像列表的获取与下载. 当时发现一个很诡异的问题. 实际上镜像仓库里面的镜像很多. 但是导出和列表里面的却很少. 经过查询发现harbor的v2.0的API里面存在一些限制. 每次api的返回结果最多是 10

配置pod拉取harbor容器镜像仓库私有镜像:secret保存账号密码

配置pod拉取harbor容器镜像仓库私有镜像:secret保存账号密码,Docker-Registry类型的Secret简介,镜像仓库简介,搭建Harbor容器镜像仓库,安装Harbor,创建项目,推送镜像到harbor镜像仓库,使用secret保存harbor账号密码拉取私有仓库的镜像

[转帖]harbor镜像仓库清理操作

https://www.cnblogs.com/FengGeBlog/p/15517706.html 两年前清理过一次harbor镜像,而现在又要面临清镜像的操作了,笔者目前所在的公司镜像是存放在ceph集群内部的,目前约200T,且该存储池是两副本,那么占用空间是400T左右。真的是相当浪费空间了

Harbor的逻辑备份与学习

Harbor的逻辑备份与学习 背景 一直想处理一下一个有网络冲突的Harbor镜像服务器 但是因为网络层自己水平一直是不是非常自信 加上Harbor容器使用的compose的玩法, 自己不敢直接处理. 所以想着至少能够备份一下Harbor仓库内的镜像. 冷备方式不用说了, 想着处理一下逻辑备份. 正

手把手教你搭建Docker私有仓库Harbor

1、什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库。Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访问的,只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部署在本地云环境中,用于组织内部

harbor镜像仓搭建相关问题

1 环境 自己生成了SSL证书 证书目录与 harbor.cfg 文件中定义的路径需要一致 使用的是offline 包安装 执行 install.sh 脚本后,通过浏览器远程访问成功, 但是在别的机器上执行docker的登录指令报错: docker login 192.168.126.100 2 异

K8S发布应用步骤详解

前言 首先以SpringBoot应用为例介绍一下k8s的发布步骤。 1.从代码仓库下载代码,比如GitLab; 2.接着是进行打包,比如使用Maven; 3.编写Dockerfile文件,把步骤2产生的包制作成镜像; 4.上传步骤3的镜像到远程仓库,比如Harhor; 5.编写Deployment文

k8s发布应用

# 前言 首先以SpringBoot应用为例介绍一下k8s的发布步骤。 1.从代码仓库下载代码,比如GitLab; 2.接着是进行打包,比如使用Maven; 3.编写Dockerfile文件,把步骤2产生的包制作成镜像; 4.上传步骤3的镜像到远程仓库,比如Harhor; 5.编写Deploymen

K8S部署应用详解

# 前言 首先以SpringBoot应用为例介绍一下k8s的发布步骤。 1.从代码仓库下载代码,比如GitLab; 2.接着是进行打包,比如使用Maven; 3.编写Dockerfile文件,把步骤2产生的包制作成镜像; 4.上传步骤3的镜像到远程仓库,比如Harhor; 5.编写Deploymen

k8s部署springboot

# 综述 首先介绍发布步骤。 1.从代码仓库下载代码,比如GitLab; 2.接着是进行打包,比如使用Maven; 3.编写Dockerfile文件,把步骤2产生的包制作成镜像; 4.上传步骤3的镜像到远程仓库,比如Harhor; 5.编写Deployment文件; 6.提交Deployment文件