<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/ DTD/wml_1.1.xml">

<wml>
<head>
<meta http-equiv="cache-control" content="max-age=180,private" />
</head>
<card title="Buildx创建多平台Docker镜像">
<p>
作者:<a href="index.php?action=showuser&amp;userid=1&amp;hash=">admin</a><br />时间:2025-06-03 09:43<br />分类:<a href="index.php?action=list&amp;cid=3&amp;hash=">电脑技术</a><br />内容:Buildx创建多平台Docker镜像


要从一个 Dockerfile 生成支持 多个平台（如 x86_64 和 ARM64）的镜像文件，你可以使用 Docker 的 Buildx 工具，它是官方提供的多平台构建解决方案。

前提条件:Docker 版本 &gt;= 20.10




启用了 BuildKit（默认已开启）：


XML/HTML代码


    export DOCKER_BUILDKIT=1

    或者

    export DOCKER_CLI_EXPERIMENTAL=enabled







验证是否开启： 




XML/HTML代码


    docker buildx version





步骤：构建多平台镜像


1. 创建 buildx builder 实例（只需一次）：


XML/HTML代码


    docker buildx create --name multi-builder --use

    docker buildx inspect --bootstrap





如果你已经有 builder，可以跳过。


2. 构建并导出镜像文件（例如 .tar）：


方法一：构建并导出为 .tar 文件（本地导出，适合离线使用）


XML/HTML代码


    docker buildx build \

      --platform linux/arm64 \

      --output type=docker,dest=multi-platform-image.tar \

      -t myimage:latest \

      -f Dockerfile .





输出类型为 docker 只支持 单平台导出，所以多平台导出推荐使用 type=oci 或 type=image：


XML/HTML代码


    docker buildx build \

      --platform linux/amd64,linux/arm64 \

      --output &quot;type=oci,dest=multi-platform.oci&quot; \

      -t myimage:latest \ 

      -f Dockerfile .





3. 或者直接推送到 Docker Hub（支持多平台）


登录 Docker Hub


使用以下命令登录 Docker Hub：




XML/HTML代码


    docker login







镜像名称必须以你的用户名开头


Docker Hub 上的免费仓库命名规则：用户名/仓库名


你的镜像名是 aaa/myimage:latest，必须保证：


你在 Docker Hub 上的用户名是 aaa


仓库名为 myimage，必须已创建或首次推送时自动创建（公共仓库）


否则你没有权限推送这个镜像。


XML/HTML代码


    docker login

    docker buildx build \

      --platform linux/amd64,linux/arm64 \

      -t yourname/myimage:latest \

      --push \

      -f Dockerfile .





验证


推送完成后可以通过以下方式验证镜像 


XML/HTML代码


    docker pull aaa/myimage:latest





常见平台标识


XML/HTML代码


    平台名称          描述

    linux/amd64   64-bit x86 平台

    linux/arm64   64-bit ARM（如树莓派4）

    linux/arm/v7  32-bit ARM

    linux/386     32-bit x86





验证镜像架构


如果你已经导出 .oci 文件：


XML/HTML代码


    tar -tvf multi-platform.oci





如果你推送到了仓库，可以用 Docker Hub 或 Skopeo 来查看：


XML/HTML代码


    skopeo inspect docker://yourname/myimage:latest





小提示


如果你想单独构建某个平台的镜像为 .tar 文件：


XML/HTML代码


    docker buildx build \

      --platform linux/arm64 \

      --output type=docker,dest=arm64-image.tar \

      -t myimage:arm64 \

      .





加快构建速度：推荐使用 --cache-to 和 --cache-from。


自己DIY的一键生成&amp;推送脚本




XML/HTML代码


    #!/bin/bash  

    set -e  

      

    # ============ 可选平台 =============  

    PLATFORM_LIST=(  

      &quot;linux/amd64 (x86_64)&quot;  

      &quot;linux/arm64 (ARMv8)&quot;  

      &quot;linux/arm/v7 (ARMv7 32-bit)&quot;  

    )  

    PLATFORM_KEYS=(  

      &quot;linux/amd64&quot;  

      &quot;linux/arm64&quot;  

      &quot;linux/arm/v7&quot;  

    )  

      

    # ============ 默认变量 =============  

    IMAGE_NAME=&quot;myimage&quot;  

    IMAGE_TAG=&quot;latest&quot;  

    DOCKERFILE=&quot;Dockerfile&quot;  

    TAR_NAME=&quot;image.tar&quot;  

    BUILD_MODE=&quot;local&quot;  

    PLATFORMS=&quot;&quot;  

      

    # ============ 平台选择菜单 ============  

    select_platforms() {  

      while true; do  

        echo &quot;&quot;  

        echo &quot;请选择要构建的平台（可多选，用空格分隔，例如 1 2）：&quot;  

        for i in &quot;${!PLATFORM_LIST[@]}&quot;; do  

          echo &quot;$((i+1)). ${PLATFORM_LIST[$i]}&quot;  

        done  

      

        read -p &quot;选择平台: &quot; PLATFORM_SELECTION  

      

        SELECTED_PLATFORMS=()  

        for index in $PLATFORM_SELECTION; do  

          if [[ $index -ge 1 &amp;&amp; $index -le ${#PLATFORM_KEYS[@]} ]]; then  

            SELECTED_PLATFORMS+=(&quot;${PLATFORM_KEYS[$((index-1))]}&quot;)  

          else  

            echo &quot;⚠️  无效平台编号: $index&quot;  

            exit 1  

          fi  

        done  

      

        PLATFORMS=$(IFS=','; echo &quot;${SELECTED_PLATFORMS[*]}&quot;)  

        break  

      done  

    }  

      

    # ============ 构建模式菜单 ============  

    select_build_mode() {  

      echo &quot;&quot;  

      echo &quot;请选择构建模式：&quot;  

      echo &quot;1. 本地构建并导入镜像（不推送）&quot;  

      echo &quot;2. 构建并导出为 tar 文件（仅支持单平台）&quot;  

      echo &quot;3. 构建并推送到远程仓库&quot;  

      

      while true; do  

        read -p &quot;输入选项 [1-3]: &quot; MODE  

        case $MODE in  

          1) BUILD_MODE=&quot;local&quot;; break;;  

          2)  

            BUILD_MODE=&quot;export&quot;  

            if [[ &quot;$PLATFORMS&quot; == *,* ]]; then  

              echo &quot;❌ 导出模式只支持单平台。请重新选择一个平台。&quot;  

              select_platforms  

            fi  

            read -p &quot;导出 tar 文件名（默认: $TAR_NAME）: &quot; INPUT_TAR  

            [[ -n &quot;$INPUT_TAR&quot; ]] &amp;&amp; TAR_NAME=&quot;$INPUT_TAR&quot;  

            break;;  

          3) BUILD_MODE=&quot;push&quot;; break;;  

          *) echo &quot;❌ 无效选项，请输入 1 ~ 3&quot;;;  

        esac  

      done  

    }  

      

    # ============ 输入镜像信息 ============  

    input_image_info() {  

      read -p &quot;镜像名称（默认: $IMAGE_NAME）: &quot; INPUT_NAME  

      [[ -n &quot;$INPUT_NAME&quot; ]] &amp;&amp; IMAGE_NAME=&quot;$INPUT_NAME&quot;  

      

      read -p &quot;镜像标签（默认: $IMAGE_TAG）: &quot; INPUT_TAG  

      [[ -n &quot;$INPUT_TAG&quot; ]] &amp;&amp; IMAGE_TAG=&quot;$INPUT_TAG&quot;  

      

      read -p &quot;Dockerfile 路径（默认: $DOCKERFILE）: &quot; INPUT_DF  

      [[ -n &quot;$INPUT_DF&quot; ]] &amp;&amp; DOCKERFILE=&quot;$INPUT_DF&quot;  

      

      # 自动修复 Dockerfile 路径  

      if [[ -d &quot;$DOCKERFILE&quot; ]]; then  

        if [[ -f &quot;$DOCKERFILE/Dockerfile&quot; ]]; then  

          echo &quot;⚠️ 检测到你输入的是目录，自动使用: $DOCKERFILE/Dockerfile&quot;  

          DOCKERFILE=&quot;$DOCKERFILE/Dockerfile&quot;  

        else  

          echo &quot;❌ 无法在目录中找到 Dockerfile: $DOCKERFILE/Dockerfile&quot;  

          exit 1  

        fi  

      elif [[ ! -f &quot;$DOCKERFILE&quot; ]]; then  

        echo &quot;❌ 指定的 Dockerfile 文件不存在: $DOCKERFILE&quot;  

        exit 1  

      fi  

    }  

      

    # ============ 初始化 builder ============  

    init_builder() {  

      if ! docker buildx inspect multi-builder &amp;&gt;/dev/null; then  

        echo &quot;???? 创建 buildx builder...&quot;  

        docker buildx create --name multi-builder --use  

        docker buildx inspect --bootstrap  

      else  

        docker buildx use multi-builder  

      fi  

    }  

      

    # ============ 执行构建 ============  

    run_build() {  

      echo &quot;&quot;  

      echo &quot;???? 构建平台: $PLATFORMS&quot;  

      echo &quot;???? Dockerfile: $DOCKERFILE&quot;  

      echo &quot;???? 镜像: $IMAGE_NAME:$IMAGE_TAG&quot;  

      

      if [[ &quot;$BUILD_MODE&quot; == &quot;push&quot; ]]; then  

        docker buildx build --platform &quot;$PLATFORMS&quot; -t &quot;$IMAGE_NAME:$IMAGE_TAG&quot; -f &quot;$DOCKERFILE&quot; . --push  

      elif [[ &quot;$BUILD_MODE&quot; == &quot;export&quot; ]]; then  

        docker buildx build --platform &quot;$PLATFORMS&quot; -t &quot;$IMAGE_NAME:$IMAGE_TAG&quot; -f &quot;$DOCKERFILE&quot; . \  

          --output &quot;type=docker,dest=$TAR_NAME&quot;  

        echo &quot;✅ 导出完成: $TAR_NAME (平台: $PLATFORMS)&quot;  

      else  

        docker buildx build --platform &quot;$PLATFORMS&quot; -t &quot;$IMAGE_NAME:$IMAGE_TAG&quot; -f &quot;$DOCKERFILE&quot; . --load  

      fi  

      echo &quot;✅ 构建完成。&quot;  

    }  

      

    # ============ 主程序 ============  

    echo &quot;=== 多平台 Docker 构建工具 ===&quot;  

    select_platforms  

    select_build_mode  

    input_image_info  

    init_builder  

    run_build  







Docker build 命令 示例


</p><p>
<a href="index.php?action=login&amp;hash=">立即登陆发表评论</a><br />
</p>
<p><a href="index.php?action=list&amp;hash=">返回日志列表</a><br /><a href="index.php?action=index&amp;hash=">返回主页</a></p>
</card>
</wml>
