問題描述
關於問題背景,參考 Multi-arch build 筆記,這里進行簡單概述。
“跨平台鏡像”是指什么呢?我們以 nginx:latest 為例,該鏡像支持八種架構,如下截圖:
在 x86 中,執行 docker pull nginx:latest 命令,將返回摘要為 044451886742 的鏡像;
在 arm64 中,執行 docker pull nginx:latest 命令,將返回摘要為 4f1e67ed43f3 的鏡像;
在 amd64 中,執行 docker pull nginx:latest 命令,將返回摘要為 b08ecc9f7997 的鏡像;
使用 Buildx 來構建多架構鏡像是非常便捷的方法。
該筆記將記錄:如何使用 buildx 構建多平台鏡像,以及常見問題處理。
解決方案
Buildx,是 CLI 插件,擴展 docker 命令,支持全部 Moby BuildKit 特性。用法同於 docker build 但又支持很多新特性,比如:
1)創建有范圍的構建器實例;
2)針對多節點進行並行構建;
第一步、安裝及啟用
安裝過程如下(詳細內容,參考 README.md/Installing 文檔)
# 第一步、下載並安裝命令 mkdir -pv ~/.docker/cli-plugins/ wget -O ~/.docker/cli-plugins/docker-buildx \ https://github.com/docker/buildx/releases/download/v0.5.1/buildx-v0.5.1.linux-amd64 chmod a+x ~/.docker/cli-plugins/docker-buildx # 第二步、設置 experimental 參數 vim ~/.docker/config.json { ... "experimental": "enabled", ... }
安裝 docker buildx 為默認構建命令。而后,執行 docker build 等同於 docker buildx 命令:
docker buildx install docker buildx uninstall # 卸載
使用 Buildx 命令,以構建鏡像
有兩種驅動:docker 與 docker-container(但是兩者也有部分不同):
1)docker,使用綁定到 dockerd 的 BuildKit 工具;
2)docker-container,使用容器運行 BuildKit 工具;
使用構建實例,以使用不同節點來構建鏡像
通過多構建實例,可以自由切換實例,然后子不同主機上執行構建任務。
使用多平台構建,以構建多個平台的鏡像
可以構建多個平台鏡像。
高級構建選項
通過 docker bake 命令,可以並行構建多個鏡像。
應用案例:構建多平台鏡像(基礎案例)
正如文章開始處的問題,該案例也是我們要完成的事情。
簡單案例
如下示例,只是為了讓我們明白使用 buildx 的大致流程:
# 獲取我們要構建的鏡像 git clone https://github.com/kstaken/dockerfile-examples.git cd dockerfile-examples/rethinkdb # 創建構建實例。通俗的講,就是創建用於構建的節點 docker buildx create --use --name build --node build --driver-opt network=host # 執行構建命令。 docker buildx build \ --tag 0xa0000/buildx-example:latest \ --platform linux/amd64,linux/arm64 . # 如果使用 --push 選項,那么在構建完成之后,會立即推送鏡像倉庫 docker buildx build --push \ --tag 0xa0000/buildx-example:latest \ --platform linux/amd64,linux/arm64 .
復雜案例
docker buildx create --name multi-platform --use \ --platform linux/amd64 \ --driver docker-container "build-node-amd64" docker buildx create --name multi-platform --append \ --platform linux/arm64 \ --driver docker-container "build-node-arm64" docker buildx build --progress plain --output "type=image,push=false" \ --file "/data/cita-monitor/agent/cita_exporter/Dockerfile" \ --tag citamon/agent-cita-exporter:20.2.2 \ --platform linux/arm64,linux/amd64 \ /data/cita-monitor/agent/cita_exporter
常見問題匯總
auto-push is currently not implemented for docker driver
buildx: auto-push is currently not implemented for docker driver · Issue #4991 · docker/for-win
問題描述:執行 docker buildx 時產生如下錯誤:
# docker buildx build --push \ --platform linux/arm/v7,linux/arm64/v8,linux/amd64 \ --tag your-username/multiarch-example:buildx-latest \ ./ auto-push is currently not implemented for docker driver
問題原因:在使用多平台構建時,需要先創建構建實例
解決方法:docker buildx create --use --name build --node build --driver-opt network=host
multiple platforms feature is currently not supported for docker driver
在執行 docker buildx build 命令時,產生如下錯誤:
# docker buildx build \ > --tag 0xa0000/buildx-example:latest \ > --platform linux/amd64,linux/arm64 . [+] Building 0.0s (0/0) error: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")
Cannot autolaunch D-Bus without X11 $DISPLAY
docker login fails while docker-compose is installed on Ubuntu 18.04 · Issue #6023 · docker/compose
問題原因:在 config.json 中,我們使用未受系統支持的憑證存儲方式。該方式將鏈接 D-Bus 服務,進而導致該錯誤。
解決方案:去掉 ~/.docker/config.json 的 "credsStore": "secretservice" 配置
unable to upgrade to tcp, received 200
相關鏈接
平台字段的命名規范(platform)
The formatting for the platform specifier is defined in
https://github.com/containerd/containerd/blob/v1.2.6/platforms/platforms.go#L63
關於 docker buildx 命令手冊
docker buildx | Docker Documentation
相關文章
「Docker」- 構建“跨平台”鏡像、多平台鏡像(Multi-Arch Images)
參考文獻
Docker Buildx | Docker Documentation
docker buildx build | Docker Documentation