本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: 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/