徹底解決Docker鏡像無法下載
前言
Docker是一個(gè)開源容器化平臺,它的核心作用是通過容器技術(shù)將應(yīng)用程序及其依賴環(huán)境打包成一個(gè)輕量級、可移植的單元,從而簡化開發(fā)、部署和運(yùn)維流程。例如我們可以通過Docker輕松部署Dify社區(qū)版,幫助開發(fā)者和企業(yè)快速構(gòu)建、部署及管理生成式AI應(yīng)用。
由于眾所周知的限制,國內(nèi)開發(fā)者訪問Docker Hub面臨諸多不便,且多個(gè)國內(nèi)鏡像源陸續(xù)出現(xiàn)了無法使用的情況。
本文介紹如何徹底解決Docker鏡像無法下載的問題。主要流程為
- 通過GitHub Workflow把Docker鏡像同步到阿里云容器鏡像服務(wù)GitHub Workflow運(yùn)行在GitHub的服務(wù)器上,可以無障礙下載Docker鏡像
- 從阿里云容器鏡像服務(wù)下載Docker鏡像到本地
GitHub Workflow介紹
GitHub Workflow是GitHub提供的一種自動化工具,用于幫助開發(fā)者更高效地管理代碼庫中的開發(fā)流程。它通過GitHub Actions實(shí)現(xiàn),允許開發(fā)者在代碼庫中定義和執(zhí)行自動化任務(wù),例如構(gòu)建、測試、部署等。GitHub Workflow的核心思想是將開發(fā)流程中的重復(fù)性任務(wù)自動化,從而減少手動操作,提高開發(fā)效率和代碼質(zhì)量。
核心概念
- GitHub ActionsGitHub Actions是GitHub提供的自動化平臺,允許你創(chuàng)建自定義的工作流(Workflow)。它基于YAML文件配置,可以在特定事件(如 push、pull request 等)觸發(fā)時(shí)執(zhí)行任務(wù)。
- WorkflowWorkflow是一個(gè)自動化流程,由一系列任務(wù)(Jobs)組成。每個(gè)Workflow對應(yīng)一個(gè) YAML文件,定義了觸發(fā)條件、執(zhí)行步驟和依賴關(guān)系。
- JobJob是Workflow中的一個(gè)任務(wù)單元,通常包含一組步驟(Steps)。每個(gè)Job在一個(gè)獨(dú)立的運(yùn)行環(huán)境中執(zhí)行,可以是虛擬機(jī)或容器。
- StepStep是Job中的具體操作,例如運(yùn)行命令、調(diào)用腳本或使用預(yù)定義的操作(Actions)。每個(gè) Step 按順序執(zhí)行。
- EventEvent是觸發(fā)Workflow的事件,例如代碼提交(push)、拉取請求(pull request)、問題創(chuàng)建(issue)等。
- ActionsActions是預(yù)定義的可重用代碼塊,可以完成特定任務(wù),例如構(gòu)建代碼、運(yùn)行測試、部署應(yīng)用等。GitHub 提供了官方Actions,也支持自定義Actions。
設(shè)置阿里云容器鏡像服務(wù)
創(chuàng)建命名空間
打開https://cr.console.aliyun.com/cn-hangzhou/instance/namespaces ,在個(gè)人版實(shí)例創(chuàng)建命名空間。
填寫命名空間,然后點(diǎn)擊“確定”
設(shè)置訪問憑證
打開https://cr.console.aliyun.com/cn-hangzhou/instance/credentials ,這里可以看到登錄的Registry實(shí)例(registry.cn-hangzhou.aliyuncs.com)。
點(diǎn)擊“設(shè)置固定密碼”
設(shè)置Github倉庫workflow
新建Github倉庫
打開https://github.com/new , 輸入倉庫名,類型選擇Private,并添加README文件
設(shè)置Actions secrets
進(jìn)入Actions secrets設(shè)置頁,點(diǎn)擊"New repository secret"
建立DOCKER_USERNAME和DOCKER_PASSWORD兩個(gè)secret,對應(yīng)阿里云容器鏡像服務(wù)的登錄賬號和密碼
設(shè)置倉庫workflow
checkout代碼到本地。在代碼目錄下創(chuàng)建文件.github\workflows\sync.yaml,內(nèi)容如下:
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
- 調(diào)用sync.sh作同步操作
在代碼目錄下創(chuàng)建sync.sh,注意按需調(diào)整以下幾個(gè)變量
1. TARGET_REGISTRY
: 阿里云容器鏡像服務(wù)的Registry實(shí)例
2. TARGET_NAMESPACE
: 阿里云容器鏡像服務(wù)的命名空間
3. IMAGES
: 要同步的鏡像(本文中以Dify 1.3.0的幾個(gè)鏡像為例)
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
驗(yàn)證workflow
提交本地倉庫改動到Github后,驗(yàn)證workflow的正確性
查看Actions workflow日志
查看阿里云容器鏡像服務(wù)的鏡像版本
打開https://cr.console.aliyun.com/cn-hangzhou/instance/repositories ,可以看到自動創(chuàng)建了相應(yīng)的鏡像倉庫
點(diǎn)擊“管理”,可查看鏡像版本
還可以查看拉取鏡像的命令
下載鏡像到本地
把命令中的your_namespace替換為你創(chuàng)建的命名空間。
# 登錄
docker login --username=you_username registry.cn-hangzhou.aliyuncs.com
# 拉取鏡像
docker pull registry.cn-hangzhou.aliyuncs.com/your_namespace/dify-api:1.3.0
# 創(chuàng)建本地tag
docker tag registry.cn-hangzhou.aliyuncs.com/your_namespace/dify-api:1.3.0 langgenius/dify-api:1.3.0
總結(jié)
至此,我們完成了Docker鏡像同步的全流程。后續(xù)要同步其它鏡像,只需要修改sync.sh的IMAGES變量并提交。