docker 在x86上build arm 镜像

news/2025/9/29 19:51:34/文章来源:https://www.cnblogs.com/codedingzhen/p/19119402

好——你想在 x86 主机上构建 ARM 镜像(比如为 Raspberry Pi 或者 ARM 服务器构建 linux/arm64 / linux/arm/v7)。下面给出一套实用、可直接复制执行的步骤、常用命令、以及常见问题与优化建议,覆盖从环境准备到构建、打包、推送的全流程。


一步到位(推荐:使用 Docker Buildx + QEMU 模拟)

这个方法最通用:buildx 会用 QEMU 做用户态仿真,把在 x86 主机上构建 ARM 镜像变得透明。

  1. 安装 QEMU / binfmt(在 Debian/Ubuntu 上):
sudo apt-get update
sudo apt-get install -y qemu-user-static binfmt-support
  1. 注册 QEMU 二进制到内核的 binfmt_misc(这步让内核能自动用 QEMU 运行 ARM 二进制):
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

如果你用的是 rootless docker 或者有安全策略,可能需要额外权限或调整。

  1. 创建并启用 buildx 构建器(推荐使用 docker-container 驱动):
docker buildx create --name mybuilder --driver docker-container --use
docker buildx inspect --bootstrap
  1. 构建(示例:同时构建 arm64 与 armv7 并推到 registry):
docker buildx build \--platform linux/arm64,linux/arm/v7 \-t yourhubname/yourimage:tag \--push \.

说明:

  • --platform 指定目标架构;也可以只写 linux/arm64
  • --push 会直接把多架构镜像推到 registry(会创建 manifest)。
  • 若只想把单一架构的镜像加载到本地 docker,可以用 --load(注意:--load 不能与多个平台一起使用,只能单个平台)。

单平台并加载到本地示例:

docker buildx build --platform linux/arm64 -t myimage:arm64 --load .

如果你只想生成一个 tar 文件(例如导入到别的机器):

docker buildx build --platform linux/arm64 -t myimage:arm64 --output type=tar,dest=./myimage-arm64.tar .

Dockerfile 的小提示

  • 一般不需要修改 Dockerfile,buildx + QEMU 会在构建时仿真执行。
  • 如果希望更显式地指定运行时平台(可选):
FROM --platform=linux/arm64 ubuntu:24.04
  • 如果你的镜像里编译本地二进制(例如使用 go build / gcc),仿真会慢,推荐交叉编译(见下节优化)。

性能与替代方案(优化建议)

  • 仿真很慢:QEMU 在构建编译步骤时会慢很多。如果你频繁编译建议:

    • 在 Dockerfile 中使用交叉编译(如 Go 的 GOOS=linux GOARCH=arm64、gcc 的交叉编译链)。
    • 在 CI 中使用原生 ARM runner(例如 GitHub Actions 的 runs-on: ubuntu-latest + buildx with qemu 或直接用 self-hosted ARM runner),或用云的 ARM 实例(AWS Graviton / 架构兼容的 runner)。
  • 缓存:使用 --cache-from / --cache-to 与 buildx 的远程缓存以加速多次构建。

  • 多阶段构建:把耗时的编译放在 builder stage,再把编译产物拷到最终镜像,能减少镜像体积和调试成本。


常见问题与解决

  • error: Cannot run binary file / 运行时报错:说明 binfmt 未正确注册,重跑第二步 multiarch/qemu-user-static
  • operation not permitted:在受限环境下运行 --privileged 的容器会被拦住,需要 root 权限或调整安全策略。
  • --load 与多平台冲突:记得 --load 只能用于单个平台构建;多平台必须 --push(或输出为 tar)。
  • 构建失败并提示 “qemu: uncaught target signal” 等:通常是仿真层面问题,先确认 QEMU 版本、重新注册 binfmt,或在 Dockerfile 中避免直接运行需要仿真的 heavy 程序(改为交叉编译)。

例子:为 Raspberry Pi 构建 armv7 镜像并推到 Docker Hub

# 1) 准备 qemu & 注册
sudo apt-get install -y qemu-user-static binfmt-support
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes# 2) buildx builder
docker buildx create --name pi-builder --driver docker-container --use
docker buildx inspect --bootstrap# 3) 构建并推送
docker buildx build \--platform linux/arm/v7 \-t yourhubname/yourpiimage:latest \--push \.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站开发用什么系统比较好?网站建设维护合同模板

前言 大家好,我是来自CSDN的寄术区博主PleaSure乐事。今天是开始学习vue的第一天,我使用的编译器是vscode,浏览器使用的是谷歌浏览器,后续会下载webstorm进行使用,当前学习阶段使用vscode也是可以的,不用担…

9.29软工

今天学了很多,就得靠练。

手机怎么做黑网站网络公司网络推广

AES加密是美国联邦政府采用的一种块加密标准,如今已经被全世界广为使用。嵌入式开发中我们也经常会用到加密解密算法,如果没有硬件模块来实现,就需要用到C代码软件实现。下面介绍调用mbedTLS中的AES加密解密函数实现AES算法。 mbedTLS是一个…

不一样的.NET烟火,基于Roslyn的开源代码生成器

功能介绍 Mud 代码生成器是一个基于Roslyn的源代码生成器,专为.NET开发者设计,用于根据实体类自动生成各种相关的代码,从而显著提升开发效率。它具有以下核心功能:DTO代码生成 - 根据实体类自动生成数据传输对象(…

详细介绍:深入浅出 XSS — 从原理到实战与防护

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

房屋在线设计网站个人网站怎么做打赏

我叫白天涯,来自计科13-1班。 首次使用这个博客园发表随笔,请大家多多关照。 本次软件工程课我希望能好好听讲,认真做课堂记录,不会的及时问老师,以及跟同学沟通,尽管我计算机这方面不是太精通,…

vxe-table 数据量过大时切换空白

vxe-table 数据量过大时切换空白问题 vxe-table单页数据超过100条时,切换页签会导致表格区域出现空白。此时滚动鼠标,数据会重新出现。 解决 给 vxe-table 标签上添加 :scroll-y="{ gt: -1 }"即可禁用虚拟…

复刻江协旋钮控制模块

复刻江协旋钮控制模块 1、初始化硬件 OLED初始化这里就不展开细讲了,可以看我之前的帖子复刻江协激光触发器旋钮初始化使能外部中断模式改为上拉根据旋钮接口接上线2、操作代码 (1) 初始化输出定义全局变量count,并初…

做自行车车队网站的名字展厅搭建公司

一、引入 在没有遇见mapstruct的时候,实现各个实体之间的转换,都是手动转换实现的,属性少一带你还好,当属性一多,代码就会变得很冗余,没必要的非逻辑的代码就会加多。。。。 比如: public cl…

Linux 基础IO与系统IO - 实践

Linux 基础IO与系统IO - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

从零开始,使用Idea工具搭建一个springboot项目

一,搭建之前准备 搭建之前先确保本机已正确安装JDK,Maven,IDEA。 以下是我的配置: OpenJDK 17 Maven 3.9.11 IDEA 2025 二,开始搭建1,打开Idea工具,File->New-> Project...2,左边选择“Spring Boot"…

最优/极值问题的算法选择

如何选择滑动窗口、二分、动态规划算法 刷leetcode时对于一些最优/极值问题往往不知采用哪一种算法,故借助大模型学习一些算法要点。1. 滑动窗口(Sliding Window) 特点适用于 数组 / 字符串 的 连续子区间 问题。 目…

珠海的门户网站有哪些深圳地址大全

ScottPlot是一款简单易用、高度定制、性能卓越的.NET绘图库,支持跨平台操作。除提供标准图表类型外,还支持交互式操作,呈现生动的数据展示。在工厂数字化系统中,可用于生产数据可视化、设备监测和质量控制。无论用于科学研究、数据…

网站开发和推广方案永康市建设银行网站查询

PHP程序的调试一直是一件让人头疼的事,它既不像VB等高级语言那样有集成的编译调试环境,也不想Perl那样可以在Linux或者DOS环境下直接运行。其实,我们完全可以通过灵活地使用echo语句来完成对PHP的调试工作。下面的几个函数可以让你随时查看程…

梁山网站建设多少钱wordpress文章末尾添加内容

前言 有时遇到这样的需求,就是在表格里面嵌入一个表格,以及要求带有分页,这样在ElementPlus中很好实现。以下使用Vue2语法实现一个简单例子,毕竟Vue3兼容Vue2语法,若想要Vue3版本例子,简单改改就OK了。 一…

外贸建站wordpress昆山网站建设jofuns

以下内容整理于Linux字符设备驱动剖析,如有侵权请告知删除 。 一、应用层的程序 应用程序一般都是open打开设备文件,read、write、ioctl设备文件,最后close设备文件退出。 int main(int argc ,char *argv[]) { unsigned char val[1] 1; …

第三方控件库的添加和使用

添加把第三方控件库先复制到根目录下 ,也就是Debug 的目录下然后再拖到工具箱的空白处下就可以了使用 和之前的控件使用相同 ‍

实用指南:基于 HTML、CSS 和 JavaScript 的智能图像灰度直方图匹配系统

实用指南:基于 HTML、CSS 和 JavaScript 的智能图像灰度直方图匹配系统2025-09-29 19:20 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: au…

C4NR PVP服务器1.2 天穹炮塔更新

C4NR PVP服务器1.2 天穹炮塔更新 更新内容在风弹获得处增加了一个建筑,可以使用风弹上去。上面是一个放置压力板的一个平台。踩压力板会获得20点风弹伤害并且生成一个风弹。玩家可以通过向指定方向攻击风弹来控制风弹…

树形dp [JOI Open 2020] 发电站 / Power Plant

作为最强摸鱼人的 BaiBaiShaFeng,这个题解也是发到洛谷上了,希望给过。 先辈们说的太简略了我感觉有点难懂,虽然我的表达能力很弱,估计强不了多少。 注:参考过网上零散题解。 题意很好理解,我们就不过多叙述了。…