使用 Docker buildx 建立多平台 Docker Image

使用 Docker buildx 建立多平台 Docker Image

目錄

最近我在建設我的網站時選擇了 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

這個 Dockerfilegolang: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

comments powered by Disqus

相關文章

高效影音處理:用 FFmpeg 輕鬆轉換、合併及提取影片

高效影音處理:用 FFmpeg 輕鬆轉換、合併及提取影片

FFmpeg 是一款功能強大的開源影音處理工具,廣泛用於影片格式轉換、擷取影片中的聲音檔、添加字幕、擷取特定片段,以及進行批次處理等。考慮到其多功能性,

閱讀更多
使用 OpenSSH 替沒有固定 IP 的本地主機 (WSL2) 建立反向 TCP 遠端通道 (Ngrok 免費替代)

使用 OpenSSH 替沒有固定 IP 的本地主機 (WSL2) 建立反向 TCP 遠端通道 (Ngrok 免費替代)

若我們希望將本地主機的服務,例如 ssh 伺服器供外部連線,但我們又沒有固定 IP 時,我們可以使用 OpenSSH 建立反向 TCP 遠端通道,讓外部主機可以透過這個通道連線到

閱讀更多
使用 asdf 工具有效管理 Elixir、Erlang、Python 和 Node.js 等多種程式語言的版本

使用 asdf 工具有效管理 Elixir、Erlang、Python 和 Node.js 等多種程式語言的版本

在軟體開發領域中,維持團隊成員工具版本的一致性是非常關鍵的。這正是 asdf 版本管理工具發揮作用的時刻。 asdf 讓你能在一個文件( .tool-versions )裡面指定所有工具的版

閱讀更多