「Docker Buildx」- 構建“跨平台”鏡像(學習筆記) @20210224


問題描述

關於問題背景,參考 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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM