使用docker buildx打包發佈多平台鏡像



個人比較喜歡影視作品,下載了大量的劇集視頻,有些文件的命名不規範,就需要重新命名,之前是用的一款 renamer 客戶端軟件,用起來不太爽就自己做了個 bs 架構的重命名軟件並開源在 github:open-renamer,為了方便自己和別人使用,也做成了 docker 鏡像發佈到了 dockerhub 中供別人使用,由於本人只有 x86 架構的設備,因此也就是有 x86 的鏡像包,結果最近有人需要 arm 版的鏡像,所以呢就來研究下怎麼在 x86 上打 arm 的鏡像。

目前 docker 已經直接支持多平台同時打包,不過需要 20 版本及以後的,同時還要開啟實驗特性。

注意:本文 docker 版本基於 20.10.5

開啟 docker 實驗特性

首先需要開啟 docker 的實驗特性,在 docker 配置文件/etc/docker/daemon.json中加入"experimental": true,如下:

{
  "registry-mirrors": [""],
  "experimental": true
}

然後執行docker version,當看到下面的內容說明開啟成功了:

docker實驗特性

安裝 buildx 插件

首先檢查是否已經安裝了 buildx 插件,命令:docker buildx version,看到如下內容說明已經有 buildx 了

如果沒有:

  1. 創建插件目錄mkdir ~/.docker/cli-plugins
  2. 下載插件到上面的目錄中wget -O ~/.docker/cli-plugins/docker-buildx //github.com/docker/buildx/releases/download/v0.8.2/buildx-v0.8.2.linux-amd64.注意這一步需要選擇自己對應平台的二進制包
  3. 授予執行權限chmod +x ~/.docker/cli-plugins/docker-buildx

官方安裝文檔:點擊跳轉

使用 dockerx 打包鏡像

假設 Dockerfile 內容如下:

FROM node:lts-buster-slim
WORKDIR /app
RUN mkdir /app && echo "hello,world">/app/hello.txt
CMD ["cat", "/app/hello.txt"]

注意:當打包到多平台時要注意 FROM 的鏡像要存在於你指定的平台中,另外其中的所有操作都要能在多平台中執行

然後創建一個構建實例。默認情況下 buildx 不支持多平台打包

# 創建構建實例。通俗的講,就是創建用於執行構建任務的節點
docker buildx create --use --name build-node-example --driver docker-container
docker buildx ls

然後就可以開始打包了

docker buildx build -t fleyx/open-renamer:0.8 --platform linux/amd64,linux/arm64 --push .

命令解釋:

  • — platform:指定目標平台用”,”分隔
  • — push:將輸出結果推送到遠程。默認情況下多平台打包的鏡像無法通過docker images查看

推送到遠程要先用docker login命令登錄

然後到 hub.docker 查看剛剛推送的鏡像就可以看到多版本支持了: