使用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
,當看到下面的內容說明開啟成功了:
安裝 buildx 插件
首先檢查是否已經安裝了 buildx 插件,命令:docker buildx version
,看到如下內容說明已經有 buildx 了
如果沒有:
- 創建插件目錄
mkdir ~/.docker/cli-plugins
- 下載插件到上面的目錄中
wget -O ~/.docker/cli-plugins/docker-buildx //github.com/docker/buildx/releases/download/v0.8.2/buildx-v0.8.2.linux-amd64
.注意這一步需要選擇自己對應平台的二進制包 - 授予執行權限
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 查看剛剛推送的鏡像就可以看到多版本支持了: