You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/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|^<none>|^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