前言

在国内使用 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_USERNAMEDOCKER_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 有免费额度
🌏 国内加速 阿里云拉取速度更快
📦 多镜像同步 一行命令同步一个镜像,可批量添加

希望这篇文章对你有帮助!有疑问欢迎留言交流。

参考链接