徹底解決Docker鏡像無法下載

前言
Docker是一個開源容器化平臺,它的核心作用是通過容器技術將應用程序及其依賴環(huán)境打包成一個輕量級、可移植的單元,從而簡化開發(fā)、部署和運維流程。例如我們可以通過Docker輕松部署Dify社區(qū)版,幫助開發(fā)者和企業(yè)快速構建、部署及管理生成式AI應用。
由于眾所周知的限制,國內開發(fā)者訪問Docker Hub面臨諸多不便,且多個國內鏡像源陸續(xù)出現(xiàn)了無法使用的情況。
本文介紹如何徹底解決Docker鏡像無法下載的問題。主要流程為
- 通過GitHub Workflow把Docker鏡像同步到阿里云容器鏡像服務GitHub Workflow運行在GitHub的服務器上,可以無障礙下載Docker鏡像
 - 從阿里云容器鏡像服務下載Docker鏡像到本地
 
GitHub Workflow介紹
GitHub Workflow是GitHub提供的一種自動化工具,用于幫助開發(fā)者更高效地管理代碼庫中的開發(fā)流程。它通過GitHub Actions實現(xiàn),允許開發(fā)者在代碼庫中定義和執(zhí)行自動化任務,例如構建、測試、部署等。GitHub Workflow的核心思想是將開發(fā)流程中的重復性任務自動化,從而減少手動操作,提高開發(fā)效率和代碼質量。
核心概念
- GitHub ActionsGitHub Actions是GitHub提供的自動化平臺,允許你創(chuàng)建自定義的工作流(Workflow)。它基于YAML文件配置,可以在特定事件(如 push、pull request 等)觸發(fā)時執(zhí)行任務。
 - WorkflowWorkflow是一個自動化流程,由一系列任務(Jobs)組成。每個Workflow對應一個 YAML文件,定義了觸發(fā)條件、執(zhí)行步驟和依賴關系。
 - JobJob是Workflow中的一個任務單元,通常包含一組步驟(Steps)。每個Job在一個獨立的運行環(huán)境中執(zhí)行,可以是虛擬機或容器。
 - StepStep是Job中的具體操作,例如運行命令、調用腳本或使用預定義的操作(Actions)。每個 Step 按順序執(zhí)行。
 - EventEvent是觸發(fā)Workflow的事件,例如代碼提交(push)、拉取請求(pull request)、問題創(chuàng)建(issue)等。
 - ActionsActions是預定義的可重用代碼塊,可以完成特定任務,例如構建代碼、運行測試、部署應用等。GitHub 提供了官方Actions,也支持自定義Actions。
 
設置阿里云容器鏡像服務
創(chuàng)建命名空間
打開https://cr.console.aliyun.com/cn-hangzhou/instance/namespaces ,在個人版實例創(chuàng)建命名空間。

填寫命名空間,然后點擊“確定”

設置訪問憑證
打開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代碼到本地。在代碼目錄下創(chuàng)建文件.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作同步操作
 
在代碼目錄下創(chuàng)建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 ,可以看到自動創(chuàng)建了相應的鏡像倉庫

點擊“管理”,可查看鏡像版本

還可以查看拉取鏡像的命令

下載鏡像到本地
把命令中的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總結
至此,我們完成了Docker鏡像同步的全流程。后續(xù)要同步其它鏡像,只需要修改sync.sh的IMAGES變量并提交。















 
 
 





 
 
 
 