当前位置: 首页 > news >正文

城乡建设部网站广州市国外学校网站设计

城乡建设部网站广州市,国外学校网站设计,上海网站排名团队,合肥市城乡建设局网站首页本脚本通过harbor v2.0 API请求,采用三层for循环,分别是project、repository、tag三层来将拉取全部镜像到本地,tag的名称列表输出到imagelist文件中。并有两三个优化改编版本。 文章目录 拉取harbor仓库全部镜像拉取全部repository中最新的几…

本脚本通过harbor v2.0 API请求,采用三层for循环,分别是project、repository、tag三层来将拉取全部镜像到本地,tag的名称列表输出到imagelist文件中。并有两三个优化改编版本。

文章目录

    • 拉取harbor仓库全部镜像
    • 拉取全部repository中最新的几个镜像
    • 拉取某个project下所有镜像
      • 用法
      • 脚本

拉取harbor仓库全部镜像

  • pull-whole-reg.sh
#!/bin/bash# Harbor 配置
HARBOR_URL="dockerhub.local:41104"
USERNAME="admin"
PASSWORD='<your_pass_word_here>'# 日志文件
LOGFILE="harbor_pull.log"
IMAGELIST="imagelist"# 清空日志文件和镜像列表
> "$LOGFILE"
> "$IMAGELIST"# 禁用缓冲并统一日志输出
exec > >(stdbuf -oL tee -a "$LOGFILE") 2>&1# 登录 Harbor
echo "Logging in to Harbor..."
if ! docker login "$HARBOR_URL" -u "$USERNAME" -p "$PASSWORD"; thenecho "[ERROR] Failed to login to Harbor. Check $LOGFILE for details."exit 1
fi# 获取总项目数量
TOTAL_PROJECTS=$(curl -s -X GET -I -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects" | grep -i "X-Total-Count" | awk '{print $2}' | tr -d '\r')
echo "Total projects: $TOTAL_PROJECTS"# 分页大小
PAGE_SIZE=10# 计算总页数
TOTAL_PAGES=$(( (TOTAL_PROJECTS + PAGE_SIZE - 1) / PAGE_SIZE ))# 获取所有项目
PROJECTS=""
for ((PAGE=1; PAGE<=TOTAL_PAGES; PAGE++)); doecho "Fetching projects (page $PAGE of $TOTAL_PAGES)..."PAGE_PROJECTS=$(curl -s -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects?page=$PAGE&page_size=$PAGE_SIZE" | jq -r '.[].name')PROJECTS="$PROJECTS $PAGE_PROJECTS"
done# 将字符串转换为数组
project_array=($PROJECTS)# 获取数组的长度
array_length=${#project_array[@]}# 遍历数组并输出索引和值
for ((index = 0; index < array_length; index++)); dovalue=${project_array[$index]}echo "[INFO] detect repository $((index+1)): $value"
done# 遍历每个项目
for PROJECT in $PROJECTS; doecho "Processing project: $PROJECT"# 获取项目下的所有镜像仓库(分页)TOTAL_REPOS=$(curl -s -X GET -I -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects/$PROJECT/repositories" | grep -i "X-Total-Count" | awk '{print $2}' | tr -d '\r')REPO_PAGES=$(( (TOTAL_REPOS + PAGE_SIZE - 1) / PAGE_SIZE ))REPOS=""for ((REPO_PAGE=1; REPO_PAGE<=REPO_PAGES; REPO_PAGE++)); doecho "Fetching repositories for project $PROJECT (page $REPO_PAGE of $REPO_PAGES)..."PAGE_REPOS=$(curl -s -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects/$PROJECT/repositories?page=$REPO_PAGE&page_size=$PAGE_SIZE" | jq -r '.[].name')REPOS="$REPOS $PAGE_REPOS"done# 遍历每个镜像仓库for REPO in $REPOS; doecho "Processing repository: $REPO"# 提取 repository_name 部分(去掉项目名称)REPO_NAME=$(echo "$REPO" | awk -F '/' '{print $2}')# 如果 repository_name 包含多层路径,则进行双重 URL 编码if [[ "$REPO" == */*/* ]]; thenREPO_NAME=$(echo "$REPO" | awk -F '/' '{print $2 "/" $3}' | sed 's|/|%252F|g')fi# 获取镜像仓库的所有 artifacts(分页)TOTAL_ARTIFACTS=$(curl -s -X GET -I -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects/$PROJECT/repositories/$REPO_NAME/artifacts" | grep -i "X-Total-Count" | awk '{print $2}' | tr -d '\r')ARTIFACT_PAGES=$(( (TOTAL_ARTIFACTS + PAGE_SIZE - 1) / PAGE_SIZE ))ARTIFACTS=""for ((ARTIFACT_PAGE=1; ARTIFACT_PAGE<=ARTIFACT_PAGES; ARTIFACT_PAGE++)); doecho "Fetching artifacts for repository $REPO (page $ARTIFACT_PAGE of $ARTIFACT_PAGES)..."PAGE_ARTIFACTS=$(curl -s -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects/$PROJECT/repositories/$REPO_NAME/artifacts?page=$ARTIFACT_PAGE&page_size=$PAGE_SIZE" | jq -r '.[].digest')ARTIFACTS="$ARTIFACTS $PAGE_ARTIFACTS"done# 遍历每个 artifact 并获取其 tagsfor ARTIFACT in $ARTIFACTS; doTAGS=$(curl -s -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects/$PROJECT/repositories/$REPO_NAME/artifacts/$ARTIFACT/tags" | jq -r '.[].name')for TAG in $TAGS; doIMAGE_NAME="$HARBOR_URL/$REPO:$TAG"echo "Pulling image: $IMAGE_NAME"if docker pull "$IMAGE_NAME"; thenecho "Dumping tags to $IMAGELIST: $IMAGE_NAME"echo "$IMAGE_NAME" >> "$IMAGELIST"sync  # 强制写入磁盘elseecho "[ERROR] Failed to pull image: $IMAGE_NAME"fiecho "---------------------------------------------------------------"donedonedone
doneecho "All images have been pulled. Check $LOGFILE for details."

拉取全部repository中最新的几个镜像

有的时候太多的老的镜像版本并没有用,那么按照时间排序,最新的在最前面,每个repository拉取最新的几个。

比如

library/loki:v4
library/loki:v3
library/loki:v2
library/loki:v1

只要前三个也就是v2-v4, 此时使用如下脚本:

#!/bin/bash# 默认获取所有 artifacts
TOP_N="all"
DRY_RUN=false# 解析命令行参数
while [[ $# -gt 0 ]]; docase "$1" in-n|--topN)TOP_N="$2"shift 2;;--dry-run)DRY_RUN=trueshift;;*)echo "Unknown option: $1"exit 1;;esac
done# Harbor 配置
HARBOR_URL="dockerhub.local:41104"
USERNAME="admin"
PASSWORD='<your_pass_word_here>'# 日志文件
LOGFILE="harbor_pull.log"
ERR_LOGFILE="harbor_pull_err.log"
IMAGELIST="repo-TopN-imagelist"
STATISTIC_LOG="statistic.log"# 清空日志文件和镜像列表
> "$LOGFILE"
> "$IMAGELIST"
> "$ERR_LOGFILE"
> "$STATISTIC_LOG"# 禁用缓冲并统一日志输出
exec > >(stdbuf -oL tee -a "$LOGFILE") 2>&1# 登录 Harbor
echo "Logging in to Harbor..."
if ! docker login "$HARBOR_URL" -u "$USERNAME" -p "$PASSWORD"; thenecho "[ERROR] Failed to login to Harbor. Check $LOGFILE for details."exit 1
fi# 获取总项目数量
TOTAL_PROJECTS=$(curl -s -X GET -I -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects" | grep -i "X-Total-Count" | awk '{print $2}' | tr -d '\r')
echo "Total projects: $TOTAL_PROJECTS"
echo "Total projects: $TOTAL_PROJECTS" >> "$STATISTIC_LOG"# 分页大小
PAGE_SIZE=10# 计算总页数
TOTAL_PAGES=$(( (TOTAL_PROJECTS + PAGE_SIZE - 1) / PAGE_SIZE ))# 获取所有项目
PROJECTS=""
for ((PAGE=1; PAGE<=TOTAL_PAGES; PAGE++)); doecho "Fetching projects (page $PAGE of $TOTAL_PAGES)..."PAGE_PROJECTS=$(curl -s -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects?page=$PAGE&page_size=$PAGE_SIZE" | jq -r '.[].name')PROJECTS="$PROJECTS $PAGE_PROJECTS"
done# 将字符串转换为数组
project_array=($PROJECTS)# 获取数组的长度
array_length=${#project_array[@]}# 遍历数组并输出索引和值
for ((index = 0; index < array_length; index++)); dovalue=${project_array[$index]}echo "[INFO] detect repository $((index+1)): $value"
done# 长分隔符
SEPARATOR="================================================================================="# 遍历每个项目
for PROJECT in $PROJECTS; doecho "$SEPARATOR" >> "$STATISTIC_LOG"echo "Processing project: $PROJECT"echo "Processing project: $PROJECT" >> "$STATISTIC_LOG"# 获取项目下的所有镜像仓库(分页)TOTAL_REPOS=$(curl -s -X GET -I -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects/$PROJECT/repositories" | grep -i "X-Total-Count" | awk '{print $2}' | tr -d '\r')REPO_PAGES=$(( (TOTAL_REPOS + PAGE_SIZE - 1) / PAGE_SIZE ))REPOS=""for ((REPO_PAGE=1; REPO_PAGE<=REPO_PAGES; REPO_PAGE++)); doecho "Fetching repositories for project $PROJECT (page $REPO_PAGE of $REPO_PAGES)..."PAGE_REPOS=$(curl -s -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects/$PROJECT/repositories?page=$REPO_PAGE&page_size=$PAGE_SIZE" | jq -r '.[].name')REPOS="$REPOS $PAGE_REPOS"done# 统计项目下的镜像仓库数量echo "Total repositories in project $PROJECT: $(echo "$REPOS" | wc -w)" >> "$STATISTIC_LOG"# 遍历每个镜像仓库for REPO in $REPOS; doecho "Processing repository: $REPO"echo "  Repository: $REPO" >> "$STATISTIC_LOG"# 提取 repository_name 部分(去掉项目名称)REPO_NAME=$(echo "$REPO" | awk -F '/' '{print $2}')# 如果 repository_name 包含多层路径,则进行双重 URL 编码if [[ "$REPO" == */*/* ]]; thenREPO_NAME=$(echo "$REPO" | awk -F '/' '{print $2 "/" $3}' | sed 's|/|%252F|g')fi# 如果指定了 TOP_N,则只取最新的 N 个 artifactsif [[ "$TOP_N" != "all" ]]; thenecho "[INFO] fetching [$PROJECT/$REPO_NAME] $TOP_N tags..."elseTOP_N=10fiARTIFACTS=$(curl -s -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects/$PROJECT/repositories/$REPO_NAME/artifacts?page=1&page_size=$TOP_N" | jq -r '.[].digest')# 统计镜像仓库下的 Tag 数量TAG_COUNT=0# 遍历每个 artifact 并获取其 tagsfor ARTIFACT in $ARTIFACTS; doTAGS=$(curl -s -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects/$PROJECT/repositories/$REPO_NAME/artifacts/$ARTIFACT/tags" | jq -r '.[].name')for TAG in $TAGS; doIMAGE_NAME="$HARBOR_URL/$REPO:$TAG"echo "    Tag: $TAG" >> "$STATISTIC_LOG"if [[ "$DRY_RUN" == true ]]; thenecho "Dry-run: Found image: $IMAGE_NAME"echo "$IMAGE_NAME" >> "$IMAGELIST"elseecho "Pulling image: $IMAGE_NAME"if docker pull "$IMAGE_NAME"; thenecho "Dumping tags to $IMAGELIST: $IMAGE_NAME"echo "$IMAGE_NAME" >> "$IMAGELIST"sync  # 强制写入磁盘elseecho "[ERROR] Failed to pull image: $IMAGE_NAME" >> "$ERR_LOGFILE"fifiecho "---------------------------------------------------------------"TAG_COUNT=$((TAG_COUNT + 1))donedoneecho "  Total tags in repository $REPO: $TAG_COUNT" >> "$STATISTIC_LOG"done
doneecho "All images have been pulled. Check $LOGFILE for details."

拉取某个project下所有镜像

那么如果想要拉取某个project下所有镜像,一般一个系统的所有镜像都会放到一个项目中。

比如dockerhub.local:31104/test-sys/minio:v1test-sys就是一个project。

用法

bash pull-project-topN.sh -p test-sys -n 3

脚本

#!/bin/bash# 默认获取所有 artifacts
TOP_N="all"
DRY_RUN=false
SPECIFIC_PROJECT=""# 解析命令行参数
while [[ $# -gt 0 ]]; docase "$1" in-n|--topN)TOP_N="$2"shift 2;;--dry-run)DRY_RUN=trueshift;;-p|--project)SPECIFIC_PROJECT="$2"shift 2;;*)echo "Unknown option: $1"exit 1;;esac
done# Harbor 配置
HARBOR_URL="dockerhub.local:41104"
USERNAME="admin"
PASSWORD='<your_pass_word_here>'# 日志文件
LOGFILE="harbor_pull.log"
ERR_LOGFILE="harbor_pull_err.log"
IMAGELIST="repo-TopN-imagelist"
STATISTIC_LOG="statistic.log"# 分页大小
PAGE_SIZE=10# 检查 PAGE_SIZE 是否为 0
if [ "$PAGE_SIZE" -eq 0 ]; thenecho "[ERROR] PAGE_SIZE cannot be 0. Please set a valid value."exit 1
fi# 清空日志文件和镜像列表
> "$LOGFILE"
> "$IMAGELIST"
> "$ERR_LOGFILE"
> "$STATISTIC_LOG"# 禁用缓冲并统一日志输出
exec > >(stdbuf -oL tee -a "$LOGFILE") 2>&1# 登录 Harbor
echo "Logging in to Harbor..."
if ! docker login "$HARBOR_URL" -u "$USERNAME" -p "$PASSWORD"; thenecho "[ERROR] Failed to login to Harbor. Check $LOGFILE for details."exit 1
fi# 如果指定了特定项目,直接处理该项目,否则获取所有项目
if [ -n "$SPECIFIC_PROJECT" ]; thenPROJECTS="$SPECIFIC_PROJECT"echo "Processing specific project: $SPECIFIC_PROJECT"
else# 获取总项目数量TOTAL_PROJECTS=$(curl -s -X GET -I -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects" | grep -i "X-Total-Count" | awk '{print $2}' | tr -d '\r')echo "Total projects: $TOTAL_PROJECTS"echo "Total projects: $TOTAL_PROJECTS" >> "$STATISTIC_LOG"# 计算总页数TOTAL_PAGES=$(( (TOTAL_PROJECTS + PAGE_SIZE - 1) / PAGE_SIZE ))# 获取所有项目PROJECTS=""for ((PAGE=1; PAGE<=TOTAL_PAGES; PAGE++)); doecho "Fetching projects (page $PAGE of $TOTAL_PAGES)..."PAGE_PROJECTS=$(curl -s -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects?page=$PAGE&page_size=$PAGE_SIZE" | jq -r '.[].name')PROJECTS="$PROJECTS $PAGE_PROJECTS"done
fi# 将字符串转换为数组
project_array=($PROJECTS)# 获取数组的长度
array_length=${#project_array[@]}# 遍历数组并输出索引和值
for ((index = 0; index < array_length; index++)); dovalue=${project_array[$index]}echo "[INFO] detect repository $((index+1)): $value"
done# 长分隔符
SEPARATOR="================================================================================="# 遍历每个项目
for PROJECT in $PROJECTS; doecho "$SEPARATOR" >> "$STATISTIC_LOG"echo "Processing project: $PROJECT"echo "Processing project: $PROJECT" >> "$STATISTIC_LOG"# 获取项目下的所有镜像仓库(分页)TOTAL_REPOS=$(curl -s -X GET -I -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects/$PROJECT/repositories" | grep -i "X-Total-Count" | awk '{print $2}' | tr -d '\r')# 计算仓库总页数REPO_PAGES=$(( (TOTAL_REPOS + PAGE_SIZE - 1) / PAGE_SIZE ))REPOS=""for ((REPO_PAGE=1; REPO_PAGE<=REPO_PAGES; REPO_PAGE++)); doecho "Fetching repositories for project $PROJECT (page $REPO_PAGE of $REPO_PAGES)..."PAGE_REPOS=$(curl -s -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects/$PROJECT/repositories?page=$REPO_PAGE&page_size=$PAGE_SIZE" | jq -r '.[].name')REPOS="$REPOS $PAGE_REPOS"done# 统计项目下的镜像仓库数量echo "Total repositories in project $PROJECT: $(echo "$REPOS" | wc -w)" >> "$STATISTIC_LOG"# 遍历每个镜像仓库for REPO in $REPOS; doecho "Processing repository: $REPO"echo "  Repository: $REPO" >> "$STATISTIC_LOG"# 提取 repository_name 部分(去掉项目名称)REPO_NAME=$(echo "$REPO" | awk -F '/' '{print $2}')# 如果 repository_name 包含多层路径,则进行双重 URL 编码if [[ "$REPO" == */*/* ]]; thenREPO_NAME=$(echo "$REPO" | awk -F '/' '{print $2 "/" $3}' | sed 's|/|%252F|g')fi# 如果指定了 TOP_N,则只取最新的 N 个 artifactsif [[ "$TOP_N" != "all" ]]; thenecho "[INFO] fetching [$PROJECT/$REPO_NAME] $TOP_N tags..."elseTOP_N=10fiARTIFACTS=$(curl -s -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects/$PROJECT/repositories/$REPO_NAME/artifacts?page=1&page_size=$TOP_N" | jq -r '.[].digest')# 统计镜像仓库下的 Tag 数量TAG_COUNT=0# 遍历每个 artifact 并获取其 tagsfor ARTIFACT in $ARTIFACTS; doTAGS=$(curl -s -u "$USERNAME:$PASSWORD" "$HARBOR_URL/api/v2.0/projects/$PROJECT/repositories/$REPO_NAME/artifacts/$ARTIFACT/tags" | jq -r '.[].name')for TAG in $TAGS; doIMAGE_NAME="$HARBOR_URL/$REPO:$TAG"echo "    Tag: $TAG" >> "$STATISTIC_LOG"if [[ "$DRY_RUN" == true ]]; thenecho "Dry-run: Found image: $IMAGE_NAME"echo "$IMAGE_NAME" >> "$IMAGELIST"elseecho "Pulling image: $IMAGE_NAME"if docker pull "$IMAGE_NAME"; thenecho "Dumping tags to $IMAGELIST: $IMAGE_NAME"echo "$IMAGE_NAME" >> "$IMAGELIST"sync  # 强制写入磁盘elseecho "[ERROR] Failed to pull image: $IMAGE_NAME" >> "$ERR_LOGFILE"fifiecho "---------------------------------------------------------------"TAG_COUNT=$((TAG_COUNT + 1))donedoneecho "  Total tags in repository $REPO: $TAG_COUNT" >> "$STATISTIC_LOG"done
doneecho "All images have been pulled. Check $LOGFILE for details."
http://www.dtcms.com/a/411657.html

相关文章:

  • 泊头网站建设公司wordpress删除主题之后
  • 一站式营销平台wordpress学校网站模板
  • LeetCode 算法题【简单】338. 比特位计数
  • 买房网站排名福州做网站建设公司
  • 爱思强交付第100套G10-SiC系统
  • 网站的建设要多少钱求推荐专门做借条的网站
  • 在线旅游攻略网站建设方案做网站要注册第35类商标吗
  • RocketMQ 核心知识整理:工作原理、常用命令与常见问题解决
  • 做养生网站怎么赚钱麻涌建设网站
  • 域名备案 没有网站网站建设意见建议表
  • Unity-Statemachinebehaviour状态机行为脚本
  • 网站问题图片房子网站有哪些
  • 孝感应城网站建设长春网站建设 找源晟
  • 如何设置网站服务器常州做网站哪家便宜
  • 单片机引脚的高电平和低电平范围值
  • 设计师可以做兼职的网站创建网站的基本步骤
  • 网站后台开发做什么凡科网网站建设
  • 什么是合同管理系统?6个核心功能介绍
  • 数据采集技术:03 有关实时采集
  • 双有源桥DAB仿真控制simulink模型大合集,simulink仿真模型。
  • 石家庄的网站的公司沈阳个人网站制作
  • 网站建设属于移动互联网青岛网站seo诊断
  • Mish激活函数:一种自正则化的非单调神经激活函数
  • Stanford CS336 assignment1(上)
  • 做网站一般几个人完成做简历的网站 知乎
  • 【思考】作为“纯硬件”的ADC芯片,它是如何识别并处理SPI命令的?
  • 申请自助建站多点网络网站制作系统
  • 郑州网站优化seo网站的设计思路怎么写
  • 影刀 RPA:定时推送信息,高效便捷省心
  • 深度学习Pytorch入门(1):手撕CIFAR 10影像分类