🚀 一键推送 Docker Hub 镜像到阿里云镜像仓库(含完整脚本)

在国内使用 Docker Hub 时,经常会遇到 503 Service Unavailable拉取速度极慢 的问题。 为了解决这个问题,我们可以将镜像从 Docker Hub 同步到 阿里云镜像仓库(ACR),以后就能稳定高速地从阿里云拉取。

本文将介绍如何将镜像(例如 xiebinn/dotnet:8.0-aspnetcore-runtime-with-ghostscript)推送到阿里云镜像服务,并提供一份可直接执行的 一键推送脚本


📘 一、思路概述

整个过程可以分为以下 5 步:

  1. 从 Docker Hub 拉取镜像(或在能访问的环境中导出镜像)
  2. 登录阿里云容器镜像服务(ACR)
  3. 给镜像重新打标签为阿里云格式
  4. 推送镜像到阿里云仓库
  5. 在服务器上从阿里云拉取使用

⚙️ 二、环境准备

假设:

  • 阿里云镜像仓库地区:registry.cn-beijing.aliyuncs.com
  • 命名空间:xdb_zc
  • 需要同步的镜像:xiebinn/dotnet:8.0-aspnetcore-runtime-with-ghostscript

🧰 三、一键推送脚本

将以下内容保存为 push-to-acr.sh 文件:

#!/bin/bash
#
# 一键推送 Docker Hub 镜像到阿里云镜像仓库
# 作者: ChatGPT(GPT-5)
# 使用: ./push-to-acr.sh xiebinn/dotnet 8.0-aspnetcore-runtime-with-ghostscript
#

# ==== 基本配置 ====
ALIYUN_REGISTRY="registry.cn-beijing.aliyuncs.com"
NAMESPACE="xdb_zc"

# ==== 参数检查 ====
if [ $# -lt 2 ]; then
  echo "❌ 使用方法: $0 <镜像名> <标签>"
  echo "例如: $0 xiebinn/dotnet 8.0-aspnetcore-runtime-with-ghostscript"
  exit 1
fi

IMAGE_NAME="$1"
IMAGE_TAG="$2"

SOURCE_IMAGE="${IMAGE_NAME}:${IMAGE_TAG}"
TARGET_IMAGE="${ALIYUN_REGISTRY}/${NAMESPACE}/$(basename ${IMAGE_NAME}):${IMAGE_TAG}"

echo "🚀 准备将镜像推送到阿里云..."
echo "📦 源镜像:   ${SOURCE_IMAGE}"
echo "🎯 目标镜像: ${TARGET_IMAGE}"
echo

# ==== Step 1. 拉取镜像 ====
echo "➡️ 1/4 拉取源镜像..."
docker pull "${SOURCE_IMAGE}" || {
  echo "❌ 拉取镜像失败,请检查网络或代理设置!"
  exit 1
}

# ==== Step 2. 重新打标签 ====
echo "➡️ 2/4 打标签为阿里云仓库格式..."
docker tag "${SOURCE_IMAGE}" "${TARGET_IMAGE}"

# ==== Step 3. 登录阿里云镜像仓库 ====
echo "➡️ 3/4 登录阿里云镜像仓库 (${ALIYUN_REGISTRY})"
docker login --username=<你的阿里云账号> "${ALIYUN_REGISTRY}"
if [ $? -ne 0 ]; then
  echo "❌ 登录阿里云失败,请确认账号密码正确"
  exit 1
fi

# ==== Step 4. 推送镜像 ====
echo "➡️ 4/4 推送镜像到阿里云..."
docker push "${TARGET_IMAGE}" || {
  echo "❌ 推送失败,请检查仓库是否存在(命名空间: ${NAMESPACE})"
  exit 1
}

echo
echo "✅ 镜像已成功推送到阿里云:"
echo "   ${TARGET_IMAGE}"
echo
echo "下次可直接使用:"
echo "   docker pull ${TARGET_IMAGE}"

🧩 四、使用方法

  1. 保存脚本

    nano push-to-acr.sh
    

    粘贴上方脚本内容后保存。

  2. 赋予执行权限

    chmod +x push-to-acr.sh
    
  3. 执行脚本

    ./push-to-acr.sh xiebinn/dotnet 8.0-aspnetcore-runtime-with-ghostscript
    
  4. 结果示例

    🚀 准备将镜像推送到阿里云...
    📦 源镜像:   xiebinn/dotnet:8.0-aspnetcore-runtime-with-ghostscript
    🎯 目标镜像: registry.cn-beijing.aliyuncs.com/xdb_zc/dotnet:8.0-aspnetcore-runtime-with-ghostscript
    
    ➡️ 1/4 拉取源镜像...
    ➡️ 2/4 打标签为阿里云仓库格式...
    ➡️ 3/4 登录阿里云镜像仓库...
    Login Succeeded
    ➡️ 4/4 推送镜像到阿里云...
    ✅ 镜像已成功推送到阿里云:
       registry.cn-beijing.aliyuncs.com/xdb_zc/dotnet:8.0-aspnetcore-runtime-with-ghostscript
    

🧠 五、离线导入镜像(可选)

如果你在国内网络环境无法拉取镜像,可以使用导出与导入方式:

在可访问 Docker Hub 的机器执行:

docker pull xiebinn/dotnet:8.0-aspnetcore-runtime-with-ghostscript
docker save -o dotnet-ghostscript.tar xiebinn/dotnet:8.0-aspnetcore-runtime-with-ghostscript

在目标服务器上执行:

docker load -i dotnet-ghostscript.tar
./push-to-acr.sh xiebinn/dotnet 8.0-aspnetcore-runtime-with-ghostscript

这样即使没有外网,也能将镜像推送到阿里云。


✅ 六、总结

步骤 命令
拉取镜像 docker pull xiebinn/dotnet:8.0-aspnetcore-runtime-with-ghostscript
标记镜像 docker tag xiebinn/dotnet:8.0-aspnetcore-runtime-with-ghostscript registry.cn-beijing.aliyuncs.com/xdb_zc/dotnet:8.0-aspnetcore-runtime-with-ghostscript
登录阿里云 docker login registry.cn-beijing.aliyuncs.com
推送镜像 docker push registry.cn-beijing.aliyuncs.com/xdb_zc/dotnet:8.0-aspnetcore-runtime-with-ghostscript
使用镜像 docker pull registry.cn-beijing.aliyuncs.com/xdb_zc/dotnet:8.0-aspnetcore-runtime-with-ghostscript

通过这个脚本,你可以在几秒内自动完成所有步骤,不再为 503 或拉取超时烦恼 🚀