使用 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

相關文章

如何重置遠端 VSCode Server 中安裝的 extension?

如何重置遠端 VSCode Server 中安裝的 extension?

最近我重新整理了一下 VSCode 的 extension,把一些不常用的或是有更好的替代的移除更換。 然而這些整理都只會同步到本地端的 extension 設定中,已經在遠端伺

閱讀更多
使用 Visual Studio Code 跨平台 C/C++ 開發環境全攻略

使用 Visual Studio Code 跨平台 C/C++ 開發環境全攻略

幾年前曾經使用 Visual Studio Code 在 Windows 上開發 C/C++,曾寫了一篇文章 記錄過程,但是當時只有在 Windows 上開發,最近又有需求要撰寫一些 C/C++ 專案,並且這次會在 macOS 和 Linux 上

閱讀更多
極致輕薄、超強續航!LG gram 14 吋連續使用 21.5 小時大挑戰 - 外出工作的最佳選擇!

極致輕薄、超強續航!LG gram 14 吋連續使用 21.5 小時大挑戰 - 外出工作的最佳選擇!

這次我要和大家分享一下我的新筆記本電腦 - LG gram 14 吋。在大學筆電壽終正寢後,我開始研究市面上的筆記本電腦,尋找最適合我的需求。這次我設定了一些挑

閱讀更多