从docker hub镜像中拉取镜像

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2025/10/10/pull-from-docker-hub-mirror/



最近换了Apple M4的MacBook,其他使用都还好,就是镜像拉群经常出问题,主要是docker hub的镜像有问题(忘记了旧电脑怎么配置的),要么就是报no matching manifest。

Error response from daemon: no matching manifest for linux/arm64/v8 in the manifest list entries: no match for platform in manifest: not found

查了下M4是ARMv9架构,具体是ARMv9.2-A,如果没有合适的镜像可以用linux/amd64试试。

专门写了一个脚本来处理这个问题

#!/bin/bash

# Docker镜像仓库列表
MIRRORS=(
    这里放自己常用的镜像
)

# 检查参数
if [ $# -ne 1 ]; then
    echo "使用方法: $0 <imagename>"
    echo "示例: $0 nginx:latest"
    exit 1
fi

IMAGE_NAME="$1"

echo "🚀 开始为镜像 $IMAGE_NAME 选择最快的镜像源..."

# 随机选择3个镜像源
selected_mirrors=()
temp_mirrors=("${MIRRORS[@]}")

for i in {1..3}; do
    if [ ${#temp_mirrors[@]} -eq 0 ]; then
        break
    fi

    # 生成随机索引
    random_index=$((RANDOM % ${#temp_mirrors[@]}))
    selected_mirrors+=("${temp_mirrors[$random_index]}")

    # 从临时数组中移除已选择的镜像源
    temp_mirrors=("${temp_mirrors[@]:0:$random_index}" "${temp_mirrors[@]:$((random_index + 1))}")
done

echo "📡 随机选择的镜像源: ${selected_mirrors[*]}"

# 测试延迟并找到最快的镜像源
fastest_mirror=""
fastest_time=9999

echo "🏃 正在测试镜像源延迟..."

for mirror in "${selected_mirrors[@]}"; do
    echo -n "测试 $mirror ... "

    # ping测试,取3次平均值
    ping_result=$(ping -c 3 -W 2 "$mirror" 2>/dev/null | grep "avg" | awk -F'/' '{print $5}')

    if [ -n "$ping_result" ]; then
        echo "${ping_result}ms"

        # 使用awk进行浮点数比较
        is_faster=$(awk -v current="$ping_result" -v fastest="$fastest_time" 'BEGIN {print (current < fastest) ? 1 : 0}')

        if [ "$is_faster" -eq 1 ]; then
            fastest_time="$ping_result"
            fastest_mirror="$mirror"
        fi
    else
        echo "超时"
    fi
done

# 检查是否找到可用的镜像源
if [ -z "$fastest_mirror" ]; then
    echo "❌ 所有选择的镜像源都无法访问,尝试直接拉取..."
    fastest_mirror=""
else
    echo "🎯 最快的镜像源: $fastest_mirror (${fastest_time}ms)"
fi

# 构建完整的镜像名称
if [ -n "$fastest_mirror" ]; then
    full_image_name="$fastest_mirror/$IMAGE_NAME"
else
    full_image_name="$IMAGE_NAME"
fi

echo "📥 开始拉取镜像: $full_image_name"

# 拉取镜像
if docker pull --platform linux/amd64 "$full_image_name"; then
    echo "✅ 镜像拉取成功!"

    # 如果使用了镜像源,则重新标记为原始名称
    if [ -n "$fastest_mirror" ]; then
        echo "🏷️  重新标记镜像为: $IMAGE_NAME"
        if docker tag "$full_image_name" "$IMAGE_NAME"; then
            echo "✅ 镜像标记成功!"

            # 询问是否删除带镜像源前缀的镜像
            read -p "是否删除带镜像源前缀的镜像 $full_image_name? (y/N): " -n 1 -r
            echo
            if [[ $REPLY =~ ^[Yy]$ ]]; then
                docker rmi "$full_image_name"
                echo "🗑️  已删除镜像: $full_image_name"
            fi
        else
            echo "❌ 镜像标记失败!"
            exit 1
        fi
    fi

    echo "🎉 完成! 镜像 $IMAGE_NAME 已准备就绪"
else
    echo "❌ 镜像拉取失败!"
    exit 1
fi

拉取效果

运行效果



本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2025/10/10/pull-from-docker-hub-mirror/

发表评论