DEV Community

JH5
JH5

Posted on • Originally published at Medium

輕量級容器映像檔 CI/CD — Crane

輕量級容器映像檔 CI/CD — Crane

過去的經驗,大部分工作與開發的環境大多具備了 crio / podman這些runtime,不過這兩年滿多平常手癢的專案其實都已經搬到 github codespace上,常常需要搬運映像檔、檢查 Manifest 內容,就會懶得裝環境,這時候,我都會想到 crane ,由…

UpdatedMarch 24, 2026•2 min read

輕量級容器映像檔 CI/CD — Crane

JJhihHao Wu**近期研究重點包含 AI Agent 的供應鏈攻擊、PII 偵測模型評估,以及醫療 AI 在臨床流程中的安全落地。

在這裡,我分享深度技術實測報告(如 NVIDIA NeMo, WildGuard)與職場技術成長心得,致力於在 AI 浪潮中打造具備資安韌性的解決方案。

On this page

輕量級容器映像檔 CI/CD — Crane探索映像檔內容在不同 Registry 複製映像檔檢查與修改映像檔 Manifest處理多架構 LLM 模型映像檔整合 crane 到 GitLab CI/CD

輕量級容器映像檔 CI/CD — Crane

過去的經驗,大部分工作與開發的環境大多具備了 crio / podman這些runtime,不過這兩年滿多平常手癢的專案其實都已經搬到 github codespace上,常常需要搬運映像檔、檢查 Manifest 內容,就會懶得裝環境,這時候,我都會想到 crane ,由 Google 開發,完全遵循 OCI 標準,不需要任何 Docker Daemon 就能直接與遠端 Registry 溝通,這點在 CI/CD Pipeline 中尤其關鍵。

  1. 輕量無依賴:單一的 Go 執行檔,不需要後台服務,非常適合在 CI/CD Runner 或其他無 Container Runtime 環境中執行。

  2. 效率至上:直接與 Registry API 互動,只傳輸必要的數據,例如在複製映像檔時只會傳輸差異化的圖層,大幅節省時間和頻寬。

  3. 功能豐富:除了基本的複製,它還能檢查映像檔的詳細資訊、修改 Manifest、甚至操作單一圖層。

讓我來介紹一些日常常用的指令範例

探索映像檔內容

想像一下,當你有一個負責Inference的Container Image,而你只想把裡面的Weight檔拿出來?

列出所有檔案crane export 會將映像檔所有圖層的內容合併並匯出到標準輸出,再搭配 tar 指令,就能像瀏覽本地文件系統一樣檢查映像檔內容。

# 將 ubuntu 映像檔的內容匯出,並用 less 分頁顯示檔案列表  
crane export ubuntu - | tar -tvf - | less
Enter fullscreen mode Exit fullscreen mode

提取單一檔案:只需要一個指令,就能從映像檔中取出你需要的檔案,而不需要將整個映像檔下載下來。

# 從 ubuntu 映像檔中提取 /etc/passwd 檔案  
crane export ubuntu - | tar -Oxf - etc/passwd
Enter fullscreen mode Exit fullscreen mode

在不同 Registry 複製映像檔

想像一下,你需要在一個私有 Registry 和一個公開 Registry 之間同步映像檔。

# 將映像檔從私有 Registry 複製到 Docker Hub  
crane copy my-private-registry/my-app:v1 docker.io/my-account/my-app:v1
Enter fullscreen mode Exit fullscreen mode

檢查與修改映像檔 Manifest

Manifest 就像是映像檔的「身分證」,它記錄了映像檔的各種資訊,包括圖層(layer) 的 SHA256 摘要、大小、MIME 類型等。

# 獲取映像檔的 Manifest  
crane manifest my-app:v1  

# 獲取映像檔的設定檔  
crane config my-app:v1  

# 提取單一圖層到本地  
crane blob my-app:v1 <layer-digest> > layer.tar.gz
Enter fullscreen mode Exit fullscreen mode

計算映像檔總大小:你可以利用 crane manifest 結合 jq 指令來精確計算映像檔的總大小。

# 計算一個映像檔的總大小(包括 Config 和所有圖層)  
crane manifest gcr.io/buildpacks/builder:v1 | jq '.config.size + ([.layers[].size] | add)' | numfmt --to=iec
Enter fullscreen mode Exit fullscreen mode

處理多架構 LLM 模型映像檔

如果你的 LLM 應用需要同時部署在不同的硬體上,例如 NVIDIA Blackwell 可選擇與x86架構CPU或Arm架構CPU組合,你可能會需要一個多平台的映像檔。

  • 情境:將 amd64arm64 兩個獨立的 LLM 映像檔,組合成一個多平台的 OCI Index
# 假設你已經有了兩個不同架構的映像檔  
# my-llm-app:v1-amd64  
# my-llm-app:v1-arm64  

# 使用 crane index append 將它們合併成一個多平台映像檔  
crane index append \  
  -t $CI_REGISTRY/my-llm-app:v1 \  
  -m $CI_REGISTRY/my-llm-app:v1-amd64 \  
  -m $CI_REGISTRY/my-llm-app:v1-arm64
Enter fullscreen mode Exit fullscreen mode

改完之後,你的部署叢集(如 Kubernetes)就可以根據目標節點的 CPU 架構,自動拉取對應的映像檔,簡化了部署複雜度。

整合 crane 到 GitLab CI/CD

在 GitLab CI/CD 的 .gitlab-ci.yml 檔案中,我們可以利用 crane 來實現自動化的映像檔發布與管理,例如,我們可以在每一次正式的release後,將一個已存在的映像檔(標記為 CI_COMMIT_SHORT_SHA)額外標記為 latest

docker-tag-latest:  
  stage: latest  
  only:  
    # 這裡的設定代表只有在 main 分支有新的提交時才會觸發這個 Job  
    refs:  
      - main  
  image:  
    # 我們可以直接使用官方的 crane 映像檔,它已經包含了 crane 工具  
    name: gcr.io/go-containerregistry/crane:debug  
    # 覆寫 entrypoint,讓我們可以直接在 shell script 中使用 crane  
    entrypoint: [""]  
  script:  
    # 使用 CI/CD 變數自動登入 GitLab Registry  
    # $CI_REGISTRY_USER 和 $CI_REGISTRY_PASSWORD 是 GitLab 預設提供的  
    - crane auth login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY  
    # 使用 crane tag 指令將映像檔標記為 latest  
    - crane tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA latest
Enter fullscreen mode Exit fullscreen mode

在 LLM 模型的開發流程中,也滿常會遇到模型權重或應用程式碼的更新後,會觸發新的Image Build,如果使用 crane,我們可以在 CI/CD 流程中自動標記(tag)新映像檔,並發布到不同的環境。

release-llm-image:  
  stage: release  
  image: gcr.io/go-containerregistry/crane:debug  
  script:  
    - crane auth login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY  
    - crane tag $CI_REGISTRY/my-llm-app:$CI_COMMIT_SHORT_SHA prod-ready  
    - crane tag $CI_REGISTRY/my-llm-app:$CI_COMMIT_SHORT_SHA latest
Enter fullscreen mode Exit fullscreen mode

曾經有陣子忘了Crane的存在,卻在近期改變日常的開發環境到雲端後,有想起他的存在XD,讓現在常常利用AI幫我寫code的我,日常工作變得更有效率,而且因為他不用安裝,在任何環境AI小助手都可以很簡易的幫我處理更多事~

# devops# docker

Top comments (0)