发布时间:2026/9/3 20:05:01
Docker buildx 多架构镜像实战:一次构建 amd64+arm64,告别 exec format error Docker buildx 多架构镜像实战:一次构建 amd64arm64,告别 exec format error你在 M 系列 Mac(arm64)上docker build打了个镜像,推到仓库,部署到云上的 x86 服务器(amd64),容器起不来,日志一行:exec /app: exec format error或者反过来:在 x86 CI 上构建的镜像,拉到树莓派、arm 云主机上跑不了。根因是镜像里的二进制是按构建机的 CPU 架构编译的,架构不匹配,内核根本没法执行。解法不是给每个架构各建一个仓库,而是用docker buildx一次构建出多架构镜像,推成一个 manifest list。用户docker pull同一个 tag,Docker 会自动挑对应自己 CPU 架构的那份。这篇手把手把它跑通。先理解:为什么普通 build 是单架构的docker build默认只为当前机器的架构构建。你可以查镜像的架构:dockerinspect--format{{.Architecture}}myapp:latest# arm64 ← 在 M1 Mac 上就是这个推上去后,x86 服务器拉下来,架构对不上,exec format error。你或许试过在服务器上加--platform:dockerrun--platformlinux/amd64 myapp:latest# 靠 QEMU 模拟,能跑但巨慢模拟能应急,但性能差、也不该用在生产。真正的解法是构建期就把两个架构都产出来。一次性准备:开启 buildx 和 QEMUbuildx是 Docker 官方的增强构建器,基于 BuildKit,新版 Docker Desktop / Docker Engine 已自带。要在一台机器上构建非本机架构的镜像,得靠 QEMU 做跨架构模拟编译。先注册 QEMU:# 注册 binfmt handlers,让本机能模拟执行其它架构的二进制dockerrun--privileged--rmtonistiigi/binfmt--installall然后创建一个支持多架构的 builder 实例(默认的 builder 不支持多平台输出):# 创建并切换到一个新的 builderdockerbuildx create--namemultiarch--driverdocker-container--use# 启动并查看它支持哪些平台dockerbuildx inspect--bootstrapinspect输出里Platforms:那行应该能看到linux/amd64, linux/arm64, linux/arm/v7 ...。看到 amd64 和 arm64 就够了。这里有个关键点:--driver docker-container。默认的dockerdriver不支持多平台构建,必须用docker-container驱动(它跑一个独立的 BuildKit 容器)。很多人第一次卡在构建报错说不支持多 platform,就是因为没换 driver。核心命令:一条命令建两个架构并推送dockerbuildx build\--platformlinux/amd64,linux/arm64\-tregistry.example.com/myapp:1.0.0\--push\.三个关键参数:--platform linux/amd64,linux/arm64:一次构建这两个架构。--push:构建完直接推到仓库。多架构构建必须直接 push,不能只--load到本地——因为本地 Docker 镜像存储没法存一个 tag 对应多架构的 manifest list,只有仓库能存。这是第二个高频坑:多平台构建加--load会报错,必须--push(或--output到 tar)。结尾的.:构建上下文。推完后验证一下 manifest,确认两个架构都在:dockerbuildx imagetools inspect registry.example.com/myapp:1.0.0输出会列出一个 manifest list,底下挂着platform: linux/amd64和platform: linux/arm64两个子 manifest。之后不管是 x86 服务器还是 arm 机器,docker pull registry.example.com/myapp:1.0.0都会自动拉对的那份,exec format error彻底消失。Dockerfile 要注意的:别把架构写死多架构构建对 Dockerfile 有要求——凡是下载某架构专属二进制的地方,都不能写死架构。BuildKit 会自动注入几个构建参数,用它们:# syntaxdocker/dockerfile:1 FROM --platform$BUILDPLATFORM golang:1.22 AS builder # BuildKit 自动提供这些 ARG,声明后即可使用 ARG TARGETOS ARG TARGETARCH WORKDIR /src COPY . . # 关键:用 TARGETOS/TARGETARCH 交叉编译出目标架构的二进制 # 这样构建在 amd64 机器上、也能产出 arm64 的可执行文件,不走 QEMU 更快 RUN CGO_ENABLED0 GOOS$TARGETOS GOARCH$TARGETARCH go build -o /app . FROM alpine:3.20 COPY --frombuilder /app /app ENTRYPOINT [/app]几个要点:$BUILDPLATFORM是构建机的架构,$TARGETPLATFORM/$TARGETOS/$TARGETARCH是目标架构。FROM --platform$BUILDPLATFORM让 builder 阶段始终跑在本机架构上(快),再靠 Go 的交叉编译产出目标架构二进制。这比让 QEMU 模拟整个编译过程快得多。ARG TARGETOS/ARG TARGETARCH必须显式声明才能在RUN里用,否则是空值。如果你下载的是预编译工具(比如 kubectl、某个 CLI),记得用$TARGETARCH拼下载 URL,别写死amd64:ARG TARGETARCH RUN curl -fsSL https://example.com/tool-linux-${TARGETARCH} -o /usr/local/bin/tool \ chmod x /usr/local/bin/tool对非 Go 项目(Node、Python 等解释型),通常不涉及交叉编译,直接--platform多架构构建、让基础镜像自己按架构拉对应版本即可,更省心。放进 CI:GitHub Actions 示例日常最实用的是让 CI 自动出多架构镜像。官方 action 已经把 QEMU、buildx 都封装好了:name:build-and-pushon:push:tags:[v*]jobs:docker:runs-on:ubuntu-lateststeps:-uses:actions/checkoutv4-name:Set up QEMUuses:docker/setup-qemu-actionv3-name:Set up Buildxuses:docker/setup-buildx-actionv3-name:Login to registryuses:docker/login-actionv3with:registry:registry.example.comusername:${{secrets.REGISTRY_USER}}password:${{secrets.REGISTRY_PASSWORD}}-name:Build and push multi-archuses:docker/build-push-actionv6with:context:.platforms:linux/amd64,linux/arm64push:truetags:registry.example.com/myapp:${{github.ref_name}}cache-from:typegha# 用 GitHub Actions 缓存加速cache-to:typegha,modemaxcache-from/cache-to: typegha会把 BuildKit 层缓存存进 GitHub Actions 缓存,第二次构建能省掉没变的层,多架构构建本来慢,这个缓存很关键。小结exec format error的根因是镜像架构和运行机器的 CPU 架构不匹配;解法是构建成多架构镜像(manifest list),让docker pull自动选对架构。准备工作:binfmt注册 QEMU docker buildx create --driver docker-container --use(默认dockerdriver 不支持多平台)。构建命令:docker buildx build --platform linux/amd64,linux/arm64 -t ... --push .。多架构必须--push,不能--load(本地存储存不下 manifest list)。Dockerfile 里用$BUILDPLATFORM$TARGETOS/$TARGETARCH交叉编译,别把架构写死;下载预编译二进制时用$TARGETARCH拼 URL。CI 用官方setup-qemu-actionbuild-push-action,配cache-from/to: typegha提速。一句话记住:用 buildx 一次产出多架构、推成一个 tag,让每台机器各取所需——这才是彻底根治exec format error的正道。

相关新闻

2026/9/3 20:05:01

LoRA在8步采样下的高动态范围保持与推理实战

最近一段时间,LoRA 相关的讨论又回到了社区热度中心。但大家讨论的焦点已经明显变了:从“怎么训出一个好看的风格 LoRA”慢慢转到了“能不能让 LoRA 在更少的采样步数下保持效果”。尤其当 MINMAX-H3 这类带着“高动态 8步加速 LoRA”标签的项目出现…

2026/9/3 20:05:01

暖风机赛元微SC92F7321程序源码解析:从选型到调试

简介:暖风机赛元微单片机SC92F7321控制程序源码包,面向家电控制与8位单片机开发者,完整实现温度检测、风速调节、安全保护等核心逻辑。包内共20个文件,压缩后大小为77KB,主要包括C语言源文件、汇编启动代码、项目头文件…

2026/9/3 20:05:01

OPC DA与Modbus TCP桥接实战:从地址映射到DCOM配置全解析

简介:OPC2Modbus专业亲测版本是一款无需授权码即可使用的OPC转Modbus协议转换工具,面向工业自动化领域需要打通OPC服务器与Modbus设备通信的工程师与集成人员,常用于PLC、传感器、驱动器、HMI等设备间的数据联通。资源以zip压缩包形式提供&am…

2026/9/3 20:50:06

Markdown、HTML 和 PPT 如何稳定交付:文档转换任务的幂等发布流程

Markdown、HTML 和 PPT 如何稳定交付,真正困难的通常不是完成一次 API 调用,而是让结果可以校验、失败可以定位、后续能够回到原始证据。本文围绕“如何把 Markdown、HTML 和 PPT 转换任务设计成可重试、可验收的文档交付流水线”给出一套可以直接落到任…

2026/9/3 20:50:06

无人快递车车顶趴人事件:无人配送的安全边界与运营规范

无人快递车车顶趴着两个人“搭便车”,新石器客服回应的消息上了热搜。我第一反应不是好笑,而是冷汗:这台车当时在什么路况下行驶?车上载了几件货?后台有没有人盯?如果它突然刹车或者转弯,车顶上…

2026/9/3 20:50:06

留学择校如何减少主观推荐:大学基础信息与 QS 排名的证据化筛选

留学择校如何减少主观推荐,真正困难的通常不是完成一次 API 调用,而是让结果可以校验、失败可以定位、后续能够回到原始证据。本文围绕“如何组合全球大学基础信息和排名数据生成有依据的留学申请短名单”给出一套可以直接落到任务状态和数据契约上的实现…

2026/9/3 20:50:06

基于Qt5与Bootloader的s9keaz128串口IAP升级方案

简介:s9keaz128串口升级方案是一套面向单片机开发者的完整资料包,主要解决该型号单片机通过串口进行固件升级与修复的需求,涵盖上位机、底层固件、烧写流程与硬件设计等环节。方案基于Qt5框架构建上位机源码,包含串口通信、升级命…

2026/9/3 20:45:05

Kubernetes 资源限制与健康检查配置指南

LimitRange kubernetes创建pod时,默认不指定资源请求和限制。如果namespace设置了配额,那么创建不指定资源请求和资源限制的pod是不允许的。为了在设定配额的namespace中使用pod,namespace还需要为pod资源请求设定默认范围。 LimitRange 资…

2026/9/3 18:28:26

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/3 14:29:47

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/3 14:30:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/3 0:02:06

零基础装 OpenClaw 小龙虾 AI:Windows 一键部署教程与避坑要点

Windows 部署 OpenClaw 完整教程|本地 AI 智能体 5 分钟落地,环境配置一次搞定 版本说明:Windows 3.1.0 / Mac 2.7.9 写在前面 近两年开源 AI 领域有一款被称作「数字员工」的工具持续走热,它就是 OpenClaw,圈内人更习…

2026/9/3 0:02:06

Hermes Agent 本地部署新方案:Windows 整合包减少依赖报错

Windows 本地部署 Hermes 太麻烦?这版一键包 5 分钟快速跑通 很多人想体验 Hermes Agent,但真正开始部署时,往往会卡在环境配置这一步。 需要安装各类依赖、调试运行环境、处理路径问题,还容易遇到命令行报错、系统拦截、文件缺…

2026/9/3 0:02:06

实测 OpenClaw 一键包,5 分钟完成本地自动化环境搭建

OpenClaw 本地 AI 自动化工具部署指南|使用一键包规避环境配置难题 痛点:部署 AI 自动化工具常常要处理 Python、Node.js 各类依赖,版本冲突、环境配置耗费大量时间,OpenClaw 提供一键安装包,降低部署门槛。 适配系统&…

2026/9/3 20:43:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/3 17:51:43

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/2 1:15:20

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…