使用 Docker buildx 建立多平台的 Docker Image
目錄
最近為了架設這個網站,我使用了
Hugo 這個靜態網站產生器,掛載
Blowfish 主題。但是因為這個主題需要 Hugo v0.115.0
以上的版本來編譯,而目前官方推薦的
Docker Hub 只有更新到 v0.111.3
版,搜尋之下也找不到有適合的 Docker Image,所以只好
自己動手做一個。
建立 Docker Image #
首先,我們先建立一個 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
的版本。
使用 buildx 建立多平台的 Docker Image #
由於我平常是在 Mac 上開發,可是我實際部署的環境是 Linux,所以我需要建立一個多平台的 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
。