使用 GitHub Action + Skopeo 同步 Docker 镜像到阿里云
前言
在国内使用 Docker Hub 拉取镜像速度较慢,很多开发者选择将常用的镜像同步到阿里云容器镜像服务(ACR)来加速访问。相比使用 GitHub Action 构建镜像,直接同步已有镜像更加简单高效。
本文介绍使用 skopeo 工具配合 GitHub Action,实现定时或手动将 Docker 镜像同步到阿里云。
为什么选择 Skopeo?
- 轻量快速:无需安装完整 Docker 环境
- 直接复制:支持跨 Registry 直接复制镜像
- 多层并行:支持并发下载镜像层,加快同步速度
- 无需构建:直接同步已有镜像,适合预编译镜像
准备工作
1. 开通阿里云容器镜像服务
登录阿里云控制台,开通 容器镜像服务 ACR,创建个人实例。
2. 创建命名空间
在 ACR 控制台创建命名空间(如 jermey),用于存放同步的镜像。
3. 配置 GitHub Secrets
在 GitHub 仓库的 Settings → Secrets and variables → Actions 中添加:
| 密钥名 | 说明 |
|---|---|
DOCKER_USERNAME |
阿里云账号(通常是邮箱前缀) |
DOCKER_PASSWORD |
阿里云镜像仓库密码 |
编写 GitHub Action 工作流
在项目根目录创建 .github/workflows/sync-images.yml:
name: Sync-Images-to-Aliyun
run-name: $ is Sync Images to Aliyun
on:
push:
branches: [ "main" ]
workflow_dispatch:
schedule:
- cron: "0 2 * * *"
jobs:
syncimages:
runs-on: ubuntu-latest
steps:
- name: Checkout Repos
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Aliyun Container Registry
uses: docker/login-action@v3
with:
registry: registry.cn-hangzhou.aliyuncs.com
username: $
password: $
logout: false
- name: Use Skopeo Tools Sync Image to Aliyun
run: |
#!/usr/bin/env bash
# 同步单个镜像
skopeo copy docker://docker.io/whyour/qinglong:latest docker://registry.cn-hangzhou.aliyuncs.com/jermey/qinglong:latest
# 同步多个镜像
skopeo copy docker://docker.io/library/nginx:latest docker://registry.cn-hangzhou.aliyuncs.com/jermey/nginx:latest
skopeo copy docker://docker.io/library/redis:latest docker://registry.cn-hangzhou.aliyuncs.com/jermey/redis:latest
skopeo copy docker://docker.io/library/postgres:latest docker://registry.cn-hangzhou.aliyuncs.com/jermey/postgres:latest
skopeo copy docker://docker.io/prom/prometheus:latest docker://registry.cn-hangzhou.aliyuncs.com/jermey/prometheus:latest
skopeo copy docker://docker.io/library/ubuntu:22.04 docker://registry.cn-hangzhou.aliyuncs.com/jermey/ubuntu:22.04
- name: Sync Complete
run: echo "镜像同步完成!"
Skopeo 同步命令详解
# 格式
skopeo copy docker://源镜像 docker://目标镜像
# 参数说明
docker:// # Docker Registry 协议前缀
docker.io # Docker Hub
registry.cn-hangzhou.aliyuncs.com # 阿里云杭州区域
jermey # 你的命名空间
qinglong:latest # 镜像名:标签
在阿里云拉取镜像
# 登录阿里云镜像仓库
docker login --username=你的用户名 registry.cn-hangzhou.aliyuncs.com
# 拉取镜像(替换为自己的命名空间)
docker pull registry.cn-hangzhou.aliyuncs.com/jermey/qinglong:latest
docker pull registry.cn-hangzhou.aliyuncs.com/jermey/nginx:latest
常用镜像同步示例
以下是可以同步的常用镜像,根据需要添加或删除:
- name: Sync Common Images
run: |
#!/usr/bin/env bash
# 基础镜像
skopeo copy docker://docker.io/library/ubuntu:22.04 docker://registry.cn-hangzhou.aliyuncs.com/jermey/ubuntu:22.04
skopeo copy docker://docker.io/library/alpine:latest docker://registry.cn-hangzhou.aliyuncs.com/jermey/alpine:latest
# Web 服务器
skopeo copy docker://docker.io/library/nginx:latest docker://registry.cn-hangzhou.aliyuncs.com/jermey/nginx:latest
skopeo copy docker://docker.io/library/httpd:latest docker://registry.cn-hangzhou.aliyuncs.com/jermey/httpd:latest
# 数据库
skopeo copy docker://docker.io/library/redis:latest docker://registry.cn-hangzhou.aliyuncs.com/jermey/redis:latest
skopeo copy docker://docker.io/library/postgres:latest docker://registry.cn-hangzhou.aliyuncs.com/jermey/postgres:latest
skopeo copy docker://docker.io/library/mysql:latest docker://registry.cn-hangzhou.aliyuncs.com/jermey/mysql:latest
skopeo copy docker://docker.io/library/mongo:latest docker://registry.cn-hangzhou.aliyuncs.com/jermey/mongo:latest
# 开发工具
skopeo copy docker://docker.io/whyour/qinglong:latest docker://registry.cn-hangzhou.aliyuncs.com/jermey/qinglong:latest
skopeo copy docker://docker.io/prom/prometheus:latest docker://registry.cn-hangzhou.aliyuncs.com/jermey/prometheus:latest
skopeo copy docker://docker.io/grafana/grafana:latest docker://registry.cn-hangzhou.aliyuncs.com/jermey/grafana:latest
阿里云 Region 对照表
常用区域对照,根据你的 ACR 实例所在区域选择:
| 区域 | Registry 地址 |
|---|---|
| 杭州 | registry.cn-hangzhou.aliyuncs.com |
| 上海 | registry.cn-shanghai.aliyuncs.com |
| 北京 | registry.cn-beijing.aliyuncs.com |
| 深圳 | registry.cn-shenzhen.aliyuncs.com |
常见问题
Q1: 提示 “unauthorized authentication required”
检查 DOCKER_USERNAME 和 DOCKER_PASSWORD 是否正确,确保密码未过期。
Q2: 同步失败,镜像不存在
确认源镜像名称和 tag 正确,可先在本地测试:
skopeo inspect docker://docker.io/镜像名:tag
Q3: 如何加速同步?
添加 --dest-multi-arch all 参数可启用多架构支持:
skopeo copy docker://源镜像 docker://目标镜像 --dest-multi-arch all
总结
使用 GitHub Action + Skopeo 同步镜像的优势:
| 特性 | 说明 |
|---|---|
| 🚀 简单高效 | 无需编写 Dockerfile,直接同步 |
| ⏰ 定时自动 | 可设置定时任务自动同步最新镜像 |
| 💰 免费使用 | GitHub Actions 有免费额度 |
| 🌏 国内加速 | 阿里云拉取速度更快 |
| 📦 多镜像同步 | 一行命令同步一个镜像,可批量添加 |
希望这篇文章对你有帮助!有疑问欢迎留言交流。