輕量級容器映像檔 CI/CD — Crane
過去的經驗,大部分工作與開發的環境大多具備了 crio / podman這些runtime,不過這兩年滿多平常手癢的專案其實都已經搬到 github codespace上,常常需要搬運映像檔、檢查 Manifest 內容,就會懶得裝環境,這時候,我都會想到 crane ,由…
UpdatedMarch 24, 2026•2 min read
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 中尤其關鍵。
輕量無依賴:單一的 Go 執行檔,不需要後台服務,非常適合在 CI/CD Runner 或其他無 Container Runtime 環境中執行。
效率至上:直接與 Registry API 互動,只傳輸必要的數據,例如在複製映像檔時只會傳輸差異化的圖層,大幅節省時間和頻寬。
功能豐富:除了基本的複製,它還能檢查映像檔的詳細資訊、修改 Manifest、甚至操作單一圖層。
讓我來介紹一些日常常用的指令範例
探索映像檔內容
想像一下,當你有一個負責Inference的Container Image,而你只想把裡面的Weight檔拿出來?
列出所有檔案:crane export 會將映像檔所有圖層的內容合併並匯出到標準輸出,再搭配 tar 指令,就能像瀏覽本地文件系統一樣檢查映像檔內容。
# 將 ubuntu 映像檔的內容匯出,並用 less 分頁顯示檔案列表
crane export ubuntu - | tar -tvf - | less
提取單一檔案:只需要一個指令,就能從映像檔中取出你需要的檔案,而不需要將整個映像檔下載下來。
# 從 ubuntu 映像檔中提取 /etc/passwd 檔案
crane export ubuntu - | tar -Oxf - etc/passwd
在不同 Registry 複製映像檔
想像一下,你需要在一個私有 Registry 和一個公開 Registry 之間同步映像檔。
# 將映像檔從私有 Registry 複製到 Docker Hub
crane copy my-private-registry/my-app:v1 docker.io/my-account/my-app:v1
檢查與修改映像檔 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
計算映像檔總大小:你可以利用 crane manifest 結合 jq 指令來精確計算映像檔的總大小。
# 計算一個映像檔的總大小(包括 Config 和所有圖層)
crane manifest gcr.io/buildpacks/builder:v1 | jq '.config.size + ([.layers[].size] | add)' | numfmt --to=iec
處理多架構 LLM 模型映像檔
如果你的 LLM 應用需要同時部署在不同的硬體上,例如 NVIDIA Blackwell 可選擇與x86架構CPU或Arm架構CPU組合,你可能會需要一個多平台的映像檔。
-
情境:將
amd64和arm64兩個獨立的 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
改完之後,你的部署叢集(如 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
在 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
曾經有陣子忘了Crane的存在,卻在近期改變日常的開發環境到雲端後,有想起他的存在XD,讓現在常常利用AI幫我寫code的我,日常工作變得更有效率,而且因為他不用安裝,在任何環境AI小助手都可以很簡易的幫我處理更多事~

Top comments (0)