徹底解決Docker鏡像無法下載
前言
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變量并提交。