使用 Docker buildx 建立多平台 Docker Image
- Leo
- 技術宅 ( tech geek)
- 2023年9月2日
目錄
最近我在建設我的網站時選擇了 Hugo
這款靜態網站生成器,並選用了 Blowfish
主題。然而,我面臨了一個挑戰:Blowfish
主題要求 Hugo
的版本至少為 v0.115.0
,但官方在 Docker Hub
上推薦的版本僅更新到了 v0.111.3
。經過一番搜索,未能找到合適的 Docker Image,於是我決定自行創建一個
。
建立 Docker Image
為了建立一個適合的 Docker Image,我從創建一個 Dockerfile
開始。以下是我使用的 Dockerfile
內容:
FROM golang:1.20.6-bookworm as builder
RUN go version
RUN go install -tags extended github.com/gohugoio/hugo@latest
RUN hugo version
這個 Dockerfile
以 golang:1.20.6-bookworm
Docker Image 為基礎,隨後安裝了最新版本的 hugo
。安裝完成後,我們會透過執行 hugo version
指令來檢查其版本。這樣,我們就能確保所建立的 Docker Image 包含了我們需要的 Hugo 版本。
利用 buildx 建立跨平台 Docker Image
我通常在 Mac M2 系統上進行開發,但實際的部署環境是 Linux x86_64,因此我需要創建一個能在多平台運行的 Docker Image。在這種情況下,我們可以使用 buildx
來實現這個目標。
在已經安裝好 Docker 的環境中,我們可以遵循以下步驟來創建跨平台的 Docker Image,並將其推送到 Docker Hub:
username=<your-docker-hub-username>
ver=$(curl --silent "https://api.github.com/repos/gohugoio/hugo/releases/latest" | jq -r .tag_name) # 透過 jq 獲取最新的版本號
ver=${ver#v}
builder=builder
if ! docker buildx ls | grep -q $builder; then
docker buildx create --name $builder # 創建 builder
fi
docker buildx use $builder # 使用 builder
docker buildx inspect --bootstrap # 啟動 builder
docker buildx build --platform=linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7 --push -t $username/hugo:$ver-ext-debian -t $username/hugo:latest . # 建立並推送到 Docker Hub
需要特別注意的是,如果你的 Mac 是使用 Apple Silicon (M1, M2) 系列的話,你需要先到 Docker Desktop 的設定中,開啟 experimental feature
,並且取消勾選 Use Rosetta for x86/amd64 emulation on Apple Silicon
,這樣才能正確使用 linux/amd64
的編譯。
完成以上步驟後,你就成功創建了一個跨平台的 Docker Image。你可以在 Docker Hub 上查看我創建的 Docker Image。
請注意,我只提供 Hugo v0.115.4
以後的版本。如果你需要 Hugo v0.111.3
或更早的版本,你可以自行修改 Dockerfile
,或者直接使用 klakegg/hugo
這個 Docker Image。
如何使用 Docker Image
使用這個 Docker Image 的步驟相當直觀。你只需要在你的 Hugo 專案目錄下運行以下的指令,就可以在你的專案目錄下生成一個名為 public
的資料夾。該資料夾中將包含已經編譯完成的靜態網站檔案。
docker run --rm -it -v $(pwd):/src jafee201153/hugo:latest hugo
此外,你也可以參考這篇文章 在 Google Cloud Run 上部署 Hugo 網站
,進一步學習如何創建自己的 Dockerfile
。