Files
ljwx-k8s/eu-harbor-prefetch-arm-images.sh
2026-02-20 22:50:45 +08:00

120 lines
3.2 KiB
Bash
Executable File

#!/bin/bash
# 在欧洲 Harbor 服务器上执行此脚本
# 用途:预拉取 ARM 平台的镜像到欧洲 Harbor 缓存
set -e
echo "=== 🇪🇺 欧洲 Harbor ARM 镜像预拉取脚本 ==="
echo ""
echo "⚠️ 请在欧洲 Harbor 服务器上执行此脚本"
echo "⚠️ 本脚本将拉取 ARM64 平台的镜像到欧洲 Harbor 缓存"
echo ""
# 检查是否在正确的服务器上
if ! hostname | grep -q "harbor.eu" && ! hostname | grep -q "eu-harbor"; then
echo "⚠️ 警告: 您可能不在欧洲 Harbor 服务器上"
echo "当前主机: $(hostname)"
read -p "是否继续?(y/N) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
fi
# 检查 Docker
if ! command -v docker &> /dev/null; then
echo "❌ Docker 未安装"
exit 1
fi
# 需要拉取的镜像列表(ARM64 平台)
IMAGES=(
"aquasec/trivy:0.66.0"
"aquasec/trivy:0.50.0"
"aquasec/trivy-operator:0.29.0"
)
echo "=== 📋 将要拉取的镜像 ==="
for img in "${IMAGES[@]}"; do
echo " - $img (linux/arm64)"
done
echo ""
# 拉取镜像
SUCCESS_COUNT=0
FAILED_COUNT=0
for img in "${IMAGES[@]}"; do
echo "=== 🔽 拉取: $img (ARM64) ==="
# 方法 1: 通过 dockerhub-proxy 拉取(推荐)
PROXY_IMG="harbor.eu.lingjingwanxiang.cn/dockerhub-proxy/$img"
echo "正在拉取: $PROXY_IMG --platform linux/arm64"
if timeout 600 docker pull --platform linux/arm64 "$PROXY_IMG"; then
echo "✅ 拉取成功: $img"
((SUCCESS_COUNT++))
# 显示镜像信息
echo "镜像详情:"
docker inspect "$PROXY_IMG" | jq -r '.[0] | {
Architecture: .Architecture,
Os: .Os,
Size: .Size,
Created: .Created
}'
echo ""
else
echo "❌ 拉取失败: $img"
((FAILED_COUNT++))
# 尝试方法 2: 直接拉取并推送到 dockerhub-proxy
echo "尝试备用方案: 直接拉取并推送到 Harbor..."
if timeout 600 docker pull --platform linux/arm64 "$img"; then
echo "✅ 直接拉取成功"
# 标记并推送到 Harbor dockerhub-proxy
docker tag "$img" "$PROXY_IMG"
if docker push "$PROXY_IMG"; then
echo "✅ 推送到 Harbor 成功: $img"
((SUCCESS_COUNT++))
((FAILED_COUNT--))
else
echo "❌ 推送到 Harbor 失败: $img"
fi
else
echo "❌ 备用方案也失败: $img"
fi
echo ""
fi
done
echo ""
echo "=== 📊 拉取结果 ==="
echo "成功: $SUCCESS_COUNT/${#IMAGES[@]}"
echo "失败: $FAILED_COUNT/${#IMAGES[@]}"
echo ""
if [ $SUCCESS_COUNT -gt 0 ]; then
echo "=== 🎉 已缓存的镜像 ==="
docker images | grep -E "trivy|aquasec" | grep -v "<none>"
echo ""
echo "=== ✅ 下一步 ==="
echo "在本地机器上执行以下命令拉取镜像:"
echo ""
for img in "${IMAGES[@]}"; do
echo " docker pull harbor.eu.lingjingwanxiang.cn/dockerhub-proxy/$img"
done
echo ""
echo "或者使用 cache-image.sh 脚本:"
echo " cd /Users/brunogao/work/codes/tools/macos/k8s"
echo " ./cache-image.sh aquasec/trivy:0.66.0"
fi
echo ""
echo "=== 完成 ==="