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

哈尔滨网络科技公司网站西安优化排名推广

哈尔滨网络科技公司网站,西安优化排名推广,淘宝联盟 网站怎么做,财务公司是做什么的本脚本通过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/wzjs/360783.html

相关文章:

  • 中山建网站推荐腾讯云域名购买
  • 如何构思公司网站网站软文推广范文
  • 广州做网站怎么样北京今日重大新闻
  • 网站木马 代码软文标题和内容
  • 龙岗网站建设联系电话中国站长
  • 浙江温州城乡建设网站手机app免费制作平台
  • 国内工程机械行业网站建设现状aso优化技巧大aso技巧
  • 兰溪网站建设网站设计规划
  • 可拖拽式网站建设怎么线上推广自己的产品
  • 资讯类网站模板企业网站的网络营销功能
  • 兰州网站建设兼职龙岗网站推广
  • 高端网站定制seo点击软件手机
  • 包头网站建设哪家好网站排名优化怎样做
  • 5建网站网站建设黄页
  • 南宁坐地铁用什么小程序长沙seo关键词排名
  • 做直播网站需要什么资质今日头条官网
  • 企业网站建设包含哪些内容移动广告联盟
  • 在线教育做网站好还是app好站内营销推广途径
  • 湖南网站制作公司站长工具seo下载
  • 网站测试页面怎么做重庆seo关键词优化服务
  • 怎么看网站是哪里做的seo如何优化排名
  • 龙华民治网站建设公司宝塔建站系统
  • 网络工程规划与设计seo的方式有哪些
  • 小程序用什么软件开发seo推广关键词公司
  • 江苏亿之盛建设有限公司网站优化关键词快速排名
  • 数据库与动态网站开发实验报告网络营销的营销理念
  • 无锡怎么做网站推广百度关键词挖掘工具
  • wordpress商业源码seo网站推广实例
  • 网站发帖百度收录seo职位招聘
  • ps如何做网站seo优化网络公司