#!/bin/bash # 描述:批量推送本地所有镜像到Harbor仓库 # 作者:运维工程师 # 使用方式:修改下方HARBOR配置后直接运行 ### 配置区(根据实际情况修改) ### HARBOR_URL="192.168.31.248:7443" # Harbor地址 PROJECT_NAME="library" # Harbor项目名称 MAX_RETRY=2 # 单镜像推送失败重试次数 CONCURRENT_PUSH=3 # 并行推送数(根据机器性能调整) ### 脚本核心逻辑(无需修改) ### FAILED_LOG="failed_images.log" TMP_IMAGE_LIST="/tmp/image_list.txt" # 登录Harbor(安全提示:建议使用凭证文件而非明文密码) echo "请登录Harbor仓库 $HARBOR_URL:" docker login $HARBOR_URL || { echo "Harbor登录失败!脚本终止。" exit 1 } # 生成镜像列表(排除Harbor自身镜像) docker images --format "{{.Repository}}:{{.Tag}}" | grep -vE "^$HARBOR_URL|^|^REPOSITORY" > $TMP_IMAGE_LIST TOTAL_IMAGES=$(wc -l < $TMP_IMAGE_LIST) CURRENT=1 echo "===== 开始推送镜像(共 $TOTAL_IMAGES 个) =====" # 定义推送函数 push_image() { local src_image=$1 local retry=0 # 转换镜像名称规则: # docker.io/library/nginx:alpine → harbor.example.com/my-project/nginx:alpine # quay.io/coreos/kube-rbac:latest → harbor.example.com/my-project/coreos/kube-rbac:latest local harbor_image=$(echo $src_image | sed \ -e "s|^docker.io/||" \ -e "s|^library/||" \ -e "s|^|$HARBOR_URL/$PROJECT_NAME/|") # 显示进度 echo "[$CURRENT/$TOTAL_IMAGES] 正在推送: $src_image → $harbor_image" # 重试逻辑 while [ $retry -le $MAX_RETRY ]; do docker tag "$src_image" "$harbor_image" if docker push "$harbor_image" > /dev/null 2>&1; then docker rmi "$harbor_image" # 清理临时tag return 0 else ((retry++)) echo "推送失败(尝试 $retry/$((MAX_RETRY+1))): $harbor_image" sleep 2 fi done echo "$src_image → $harbor_image" >> $FAILED_LOG return 1 } # 并行推送控制 export -f push_image export HARBOR_URL PROJECT_NAME MAX_RETRY FAILED_LOG CURRENT TOTAL_IMAGES cat $TMP_IMAGE_LIST | xargs -P $CONCURRENT_PUSH -I {} bash -c 'push_image "$@"' _ {} # 结果统计 SUCCESS_COUNT=$(($TOTAL_IMAGES - $(wc -l < $FAILED_LOG 2>/dev/null || echo 0))) echo "===== 推送完成 =====" echo "成功: $SUCCESS_COUNT" echo "失败: $(wc -l < $FAILED_LOG 2>/dev/null || echo 0)" [[ -s $FAILED_LOG ]] && echo "失败列表详见: $FAILED_LOG" # 清理临时文件 rm $TMP_IMAGE_LIST