云计算百科
云计算领域专业知识百科平台

国内拉 Docker 镜像总超时?用 GitHub Action 一键转存到阿里云(开源神器实测)

国内拉 Docker 镜像总超时?用 GitHub Action 一键转存到阿里云(开源神器实测)

你是不是也经常遇到这种情况:服务器上 docker pull mysql、docker pull nginx 卡半天最后超时失败,或者干脆连不上 Docker Hub。尤其是国内云服务器,拉取国外镜像的体验一言难尽。

本文介绍一个开源工具 docker_image_pusher,用 GitHub Action 把 Docker Hub、gcr.io、k8s.io、ghcr.io 等国外镜像自动转存到你的阿里云容器镜像仓库,国内服务器直接 docker pull 阿里云地址,速度快还免费。目前项目已收获 2.9k+ Star、1.6w+ Fork,是同类方案里最省心的一个。

本文基于开源项目 tech-shrimp/docker_image_pusher 整理,原作者为技术爬爬虾,转载请注明出处。

一、它能解决什么问题

痛点本方案
国内直连 Docker Hub 慢、超时、被墙 转存后从阿里云拉,走国内线路
手动 docker pull + docker tag + docker push 太繁琐 改个文件自动触发,全程无人值守
大镜像(最大支持 40GB)传输易断 借助 GitHub 官方 Runner,稳定拉满带宽
多架构镜像难搞 支持 –platform 指定架构

核心原理:GitHub Action 在国外 Runner 上拉取镜像,再推送到你的阿里云 ACR 私有仓库。你只需要把想要的镜像写进一个清单文件,剩下的交给 CI。

二、前置准备

只需要两样东西:

  • 一个阿里云账号(有容器镜像服务 ACR,个人版免费)
  • 一个 GitHub 账号(用来跑 Action,同样免费)
  • 不需要自己准备服务器,不需要本地装 Docker。

    三、配置阿里云(拿 4 个关键信息)

  • 登录 阿里云容器镜像服务控制台
  • 启用个人实例
  • 创建一个命名空间(Namespace),记下这个名称,后面叫它 ALIYUN_NAME_SPACE
  • 进入「访问凭证」→「获取环境变量」,记下三个值:
    • 用户名 → ALIYUN_REGISTRY_USER
    • 密码 → ALIYUN_REGISTRY_PASSWORD
    • 仓库地址 → ALIYUN_REGISTRY(形如 registry.cn-hangzhou.aliyuncs.com)
  • 小提示:仓库地址里的地域(如 cn-hangzhou)选离你服务器近的,拉取更快。

    四、Fork 项目并配置

    4.1 Fork 本项目

    打开 docker_image_pusher,点击右上角 Fork,把项目复制到你的 GitHub 账号下。

    4.2 启用 GitHub Action

    进入你 Fork 后的项目,点击顶部 Actions 标签,按提示启用 Workflow。

    4.3 配置 4 个 Secrets

    进入 Settings → Secrets and variables → Actions → New repository secret,把上面拿到的 4 个值分别建为 Secret:

    Secret 名称值
    ALIYUN_NAME_SPACE 你的命名空间名
    ALIYUN_REGISTRY_USER 阿里云用户名
    ALIYUN_REGISTRY_PASSWORD 阿里云密码
    ALIYUN_REGISTRY 仓库地址,如 registry.cn-hangzhou.aliyuncs.com

    这四个值是整个方案的"钥匙",只存在 GitHub Secret 里,不会出现在代码里,相对安全。

    五、添加你想转存的镜像

    打开项目里的 images.txt 文件,每行写一个镜像:

    # 这是注释,# 开头不会处理
    nginx
    mysql:8.0
    redis:7

    # 指定架构(多架构场景)
    –platform=linux/amd64 nginx:latest

    # 指定源仓库(默认是 Docker Hub)
    k8s.gcr.io/kube-state-metrics/kube-state-metrics
    ghcr.io/owner/repo:tag

    规则说明:

    • 可加 tag,也可不加(不加默认 latest)
    • 可用 –platform=xxxxx 指定架构
    • 可用 源仓库/镜像名 格式指定非 Docker Hub 的源,如 k8s.gcr.io/…、ghcr.io/…
    • # 开头是注释

    把文件提交(Commit)后,GitHub Action 自动触发构建,开始拉取并转存。

    六、在国内服务器使用

    回到阿里云控制台「镜像仓库」,能看到刚转存好的镜像。可以把它设为公开,这样拉取免登录。

    在国内服务器直接 pull:

    docker pull registry.cn-hangzhou.aliyuncs.com/<你的命名空间>/alpine

    对应关系:

    • registry.cn-hangzhou.aliyuncs.com → 你的 ALIYUN_REGISTRY
    • <你的命名空间> → 你的 ALIYUN_NAME_SPACE
    • alpine → 镜像名

    想省事就把仓库设成公开;若要保持私有,国内服务器需先 docker login 一次。

    七、进阶玩法

    1. 多架构镜像

    在 images.txt 里用 –platform=linux/amd64 或 –platform=linux/arm64 指定,指定后的架构会作为前缀加在镜像名前,互不冲突。

    2. 镜像重名自动处理

    如果不同源有同名镜像(如 xhofe/alist 和 xiaoyaliu/alist),程序会自动把命名空间作为前缀加在镜像名前,避免覆盖。

    3. 定时自动同步

    修改项目里的 .github/workflows/docker.yaml,加一段 schedule 即可定时执行(注意 cron 用的是 UTC 时区):

    on:
    schedule:
    cron: '0 18 * * *' # 每天 UTC 18:00(北京时间次日 02:00)执行
    workflow_dispatch: # 保留手动触发

    八、常见坑与注意事项

  • 阿里云有免费额度,但超量会收费 个人版 ACR 有存储和流量免费额度,超出部分按量计费。长期不用的大镜像建议定期清理,或把仓库设为只读后下载到本地归档。

  • 密码不是登录密码 ALIYUN_REGISTRY_PASSWORD 是容器镜像服务「访问凭证」里单独生成的密码,不是阿里云账号登录密码。

  • Action 偶尔失败 GitHub 免费 Runner 偶尔排队或网络抖动导致失败,直接到 Actions 页面手动 Re-run 即可,不影响已成功转存的镜像。

  • 敏感信息保护 虽然 Secret 不会明文暴露,但转存到公开的阿里云仓库等于把镜像"公开托管"。不要拿它转存任何含私密代码的镜像。

  • 九、总结

    这套方案把"国外镜像拉不动"的痛点彻底解决,且完全免费、基本零维护:

    • 配置一次,日后只改 images.txt 一行就能加新镜像
    • 国内线路拉取,速度和稳定性都比直连 Docker Hub 好太多
    • 支持多架构、多源仓库、定时同步

    如果你也被 Docker Hub 的拉取速度折磨过,强烈建议花 10 分钟把这个工具配起来。觉得本文有帮助的话,别忘了 点赞 👍 + 收藏 ⭐,你的支持是我持续输出的动力!

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 国内拉 Docker 镜像总超时?用 GitHub Action 一键转存到阿里云(开源神器实测)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!