120 lines
3.2 KiB
Bash
Executable File
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 "=== 完成 ==="
|