前言
Docker是一个开源容器化平台,它的核心作用是通过容器技术将应用程序及其依赖环境打包成一个轻量级、可移植的单元,从而简化开发、部署和运维流程。例如我们可以通过Docker轻松部署Dify社区版,帮助开发者和企业快速构建、部署及管理生成式AI应用。
由于众所周知的限制,国内开发者访问Docker Hub面临诸多不便,且多个国内镜像源陆续出现了无法使用的情况。
本文介绍如何彻底解决Docker镜像无法下载的问题。主要流程为
- 通过GitHub Workflow把Docker镜像同步到阿里云容器镜像服务GitHub Workflow运行在GitHub的服务器上,可以无障碍下载Docker镜像
- 从阿里云容器镜像服务下载Docker镜像到本地
GitHub Workflow介绍
GitHub Workflow是GitHub提供的一种自动化工具,用于帮助开发者更高效地管理代码库中的开发流程。它通过GitHub Actions实现,允许开发者在代码库中定义和执行自动化任务,例如构建、测试、部署等。GitHub Workflow的核心思想是将开发流程中的重复性任务自动化,从而减少手动操作,提高开发效率和代码质量。
核心概念
- GitHub ActionsGitHub Actions是GitHub提供的自动化平台,允许你创建自定义的工作流(Workflow)。它基于YAML文件配置,可以在特定事件(如 push、pull request 等)触发时执行任务。
- WorkflowWorkflow是一个自动化流程,由一系列任务(Jobs)组成。每个Workflow对应一个 YAML文件,定义了触发条件、执行步骤和依赖关系。
- JobJob是Workflow中的一个任务单元,通常包含一组步骤(Steps)。每个Job在一个独立的运行环境中执行,可以是虚拟机或容器。
- StepStep是Job中的具体操作,例如运行命令、调用脚本或使用预定义的操作(Actions)。每个 Step 按顺序执行。
- EventEvent是触发Workflow的事件,例如代码提交(push)、拉取请求(pull request)、问题创建(issue)等。
- ActionsActions是预定义的可重用代码块,可以完成特定任务,例如构建代码、运行测试、部署应用等。GitHub 提供了官方Actions,也支持自定义Actions。
设置阿里云容器镜像服务
创建命名空间
打开https://cr.console.aliyun.com/cn-hangzhou/instance/namespaces ,在个人版实例创建命名空间。
填写命名空间,然后点击“确定”
设置访问凭证
打开https://cr.console.aliyun.com/cn-hangzhou/instance/credentials ,这里可以看到登录的Registry实例(registry.cn-hangzhou.aliyuncs.com)。
点击“设置固定密码”
设置Github仓库workflow
新建Github仓库
打开https://github.com/new , 输入仓库名,类型选择Private,并添加README文件
设置Actions secrets
进入Actions secrets设置页,点击"New repository secret"
建立DOCKER_USERNAME和DOCKER_PASSWORD两个secret,对应阿里云容器镜像服务的登录账号和密码
设置仓库workflow
checkout代码到本地。在代码目录下创建文件.github\workflows\sync.yaml,内容如下:
name: Sync Docker Image run-name: ${{ github.actor }} is running GitHub Actions on: [push] jobs: Sync-Docker-Image-Actions: runs-on: ubuntu-latest steps: - name: Check out repository code 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" - run: echo "This job's status is ${{ job.status }}"
yaml定义的主体流程是
- checkout代码
- 登录到阿里云docker registry
- 调用sync.sh作同步操作
在代码目录下创建sync.sh,注意按需调整以下几个变量
1. TARGET_REGISTRY: 阿里云容器镜像服务的Registry实例
2. TARGET_NAMESPACE: 阿里云容器镜像服务的命名空间
3. IMAGES: 要同步的镜像(本文中以Dify 1.3.0的几个镜像为例)
sync.sh脚本如下:
#!/bin/bash set -eux TARGET_REGISTRY=registry.cn-hangzhou.aliyuncs.com TARGET_NAMESPACE=your_namespace IMAGES="langgenius/dify-api:1.3.0 langgenius/dify-web:1.3.0 langgenius/dify-plugin-daemon:0.0.8-local" 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
提交本地仓库改动到Github
git add . git commit -m "add workflow" git push
验证workflow
提交本地仓库改动到Github后,验证workflow的正确性
查看Actions workflow日志
查看阿里云容器镜像服务的镜像版本
打开https://cr.console.aliyun.com/cn-hangzhou/instance/repositories ,可以看到自动创建了相应的镜像仓库
点击“管理”,可查看镜像版本
还可以查看拉取镜像的命令
下载镜像到本地
把命令中的your_namespace替换为你创建的命名空间。
# 登录 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
总结
至此,我们完成了Docker镜像同步的全流程。后续要同步其它镜像,只需要修改sync.sh的IMAGES变量并提交。