由于网络访问限制,国内开发者访问 GitHub (https://github.com/) 存在明显延迟和稳定性问题。同时,部分国内镜像源近期也频繁出现服务不可用的情况,进一步增加了开发环境配置的难度。
本文将介绍一种高效稳定的镜像同步方案,利用GitHub Actions + 阿里云容器镜像服务实现无缝下载。
1.镜像同步
通过GitHub Actions工作流自动拉取目标Docker镜像(利用GitHub境外服务器无障碍访问Docker Hub)将镜像自动推送至阿里云容器镜像服务(ACR)的私有仓库 2.本地拉取 阿里云ACR拉取镜像到本地开发环境,享受国内高速下载。
一、GitHub Workflow介绍
GitHub Workflow(也称为 GitHub Actions Workflow)是 GitHub 提供的 自动化 CI/CD(持续集成/持续交付)工具,用于帮助开发者更高效地管理代码库中的开发流程。它通过GitHub Actions实现,允许开发者在代码库中定义和执行自动化任务,例如构建、测试、部署等。GitHub Workflow的核心思想是将开发流程中的重复性任务自动化,从而减少手动操作,提高开发效率和代码质量。
核心概念
GitHub Actions:GitHub提供的自动化平台,允许你创建自定义的工作流(Workflow)。它基于YAML文件配置,可以在特定事件(如 push、pull request 等)触发时执行任务。
Workflow:一个自动化流程,由一系列任务(Jobs)组成。每个Workflow对应一个 YAML文件,定义了触发条件、执行步骤和依赖关系。
Job:Workflow中的一个任务单元,通常包含一组步骤(Steps)。每个Job在一个独立的运行环境中执行,可以是虚拟机或容器。
Step:Job中的具体操作,例如运行命令、调用脚本或使用预定义的操作(Actions)。每个 Step 按顺序执行。
Event:触发Workflow的事件,例如代码提交(push)、拉取请求(pull request)、问题创建(issue)等。
Actions:预定义的可重用代码块,可以完成特定任务,例如构建代码、运行测试、部署应用等。GitHub 提供了官方Actions,也支持自定义Actions。
二、设置Github仓库workflow
1.新建一个github仓库
2.设置Actions secrets
设置需要登录阿里云的用户密码
3.设置同步镜像仓库的脚本
可以直接在github上面编辑,也可以git clone git@github.com:liuxing141/image_sync.git到本地,然后编辑。
具体脚本如下sync.sh:
TARGET_REGISTRY
: 阿里云容器镜像服务的Registry实例
TARGET_NAMESPACE
: 阿里云容器镜像服务的命名空间
IMAGES
: 要同步的镜像(本文中以Dify 1.3.0的几个镜像为例)
#!/bin/bash
set -eux
TARGET_REGISTRY=registry.cn-hangzhou.aliyuncs.com
TARGET_NAMESPACE=liuxing666
IMAGES="langgenius/dify-api:1.3.0 langgenius/dify-web:1.3.0"
for image in${IMAGES} ; do
#拉取镜像
docker pull $image
name=`echo$image | cut -d '/' -f2`
tag=`echo${name} | cut -d ':' -f2`
targetFullName=${TARGET_REGISTRY}/${TARGET_NAMESPACE}/${name}
#打阿里云的tag
docker tag ${image}${targetFullName}
#推送到阿里云
docker push ${targetFullName}
done
4.设置仓库workflow
创建.github\workflows\sync.yaml
具体代码如下sync.yaml:
name: Sync Docker Image
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
workflow_dispatch:
jobs:
# This workflow contains a single job called "build"
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: login to docker registry
run: docker login -u "${{ secrets.DOCKER_USERNAME }}" -p "${{ secrets.DOCKER_PASSWORD }}" registry.cn-hangzhou.aliyuncs.com
- name: execute sync.sh
run: |
bash "${{ github.workspace }}/sync.sh"
三、测试
点击actions查看日志是否运行成功
成功后登录阿里云查看是否存在下载的镜像
发现已经有啦,然后自己就可以通过阿里云下载需要的镜像了。
# 登录
docker login --username=you_username registry.cn-hangzhou.aliyuncs.com
# 拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/your_namespace/dify-api:1.3.0
# 创建本地tag
docker tag registry.cn-hangzhou.aliyuncs.com/your_namespace/dify-api:1.3.0 langgenius/dify-api:1.3.0