使用buildx在x86机器上面编译arm64架构的Docker镜像

使用,buildx,x86,机器,上面,编译,arm64,架构,docker,镜像 · 浏览次数 : 292

小编点评

**多架构编译安装docker下载docker下载buildx安装架构支持docker run --privileged --rm tonistiigi/binfmt --install all** **信息:** * 使用 Docker Buildx 创建多架构的容器。 * 构建基于arm64、amd64和arm64v2平台的 Docker Images。 * 使用 `docker run` 命令启动容器时指定平台。 **步骤:** 1. 创建一个名为 `mybuilder` 的 Docker Buildx build。 2. 使用 `--use` 选项指定多架构构建。 3. 使用 `--name` 选项指定容器名称为 `mybuilder`。 4. 使用 `--bootstrapNodes` 选项指定 Bootstrap节点的 IP 地址和端口。 5. 使用 `--buildx build` 指令构建 Docker Images。 6. 使用 `docker run` 命令启动容器。 **构建 Docker Images 的详细信息:** * `FROM docker.io/adoptopenjdk/openjdk8WORKDIR /app`:从 Docker Hub上的 OpenJDK WORKDIR镜像构建基础镜像。 * `COPY /app /app /appENTRYPOINT [\"java\",\"-Djava.security.egd=file:/dev/./urandom\",\"-Dloader.path=./server/runtime/3rd,./server/runtime/libs\",\"-Dparallel.startup=true\",\"-Dserver.runtime.path.name=server\",\"-XX:+UseContainerSupport\",\"-XX:MaxRAMPercentage=75.0\",\"-XX:InitialRAMPercentage=75.0\",\"-XX:MinRAMPercentage=75.0\",\"-XX:-DisableExplicitGC\",\"-XX:+PrintGC\",\"-XX:+PrintGCDateStamps\",\"-XX:+PrintGCDetails\",\"-XX:+PrintGCTimeStamps\",\"-Xloggc:/app/dump/gclog\",\"-XX:+HeapDumpOnOutOfMemoryError\",\"-XX:HeapDumpPath=/app/dump\",\"-jar\",\"./server/runtime/caf-bootstrap.jar\",\"--spring.config.location=./server/runtime/\"]`:构建容器时运行 Java镜像的构建步骤。 **其他提示:** * 使用 `docker buildx build -t zhaobsh:arm64 --platform=linux/arm64 -o type=docker .` 命令构建针对arm64平台的 Docker Images。 * 使用 `docker buildx build -t zhaobsh:amd64 --platform=linux/amd64 -o type=docker .` 命令构建针对amd64平台的 Docker Images。 * 使用 `docker buildx build -t harbor.xxxx.com/library/zhaobsh --platform=linux/arm,linux/arm64,linux/amd64 . --push#` 命令构建针对arm、arm64和amd64平台的 Docker Images并将其推送到 Harbor。

正文

buildx 多架构编译


安装docker

下载docker
下载buildx
安装架构支持
docker run --privileged --rm tonistiigi/binfmt --install all

创建一个自己的空间
buildx create --use --name mybuilder

检查支持的架构
buildx inspect mybuilder --bootstrap

Nodes:
Name:      mybuilder0
Endpoint:  unix:///var/run/docker.sock
Status:    running
Buildkit:  v0.11.6
Platforms: linux/arm64, linux/amd64, linux/amd64/v2, linux/riscv64, linux/ppc64le, linux/s390x, linux/mips64le, linux/mips64

打包镜像

dockerfile 的信息为:
# 注意from 好像不能写带架构的. 会根据platform自动进行下载. 比较简单. 


FROM docker.io/adoptopenjdk/openjdk8
WORKDIR /app
COPY /app /app
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dloader.path=./server/runtime/3rd,./server/runtime/libs","-Dparallel.startup=true","-Dserver.runtime.path.name=server","-XX:+UseContainerSupport","-XX:MaxRAMPercentage=75.0","-XX:InitialRAMPercentage=75.0","-XX:MinRAMPercentage=75.0","-XX:-DisableExplicitGC","-XX:+PrintGC","-XX:+PrintGCDateStamps","-XX:+PrintGCDetails","-XX:+PrintGCTimeStamps","-Xloggc:/app/dump/gclog","-XX:+HeapDumpOnOutOfMemoryError","-XX:HeapDumpPath=/app/dump","-jar","./server/runtime/caf-bootstrap.jar","--spring.config.location=./server/runtime/"]


buildx build -t zhaobsh:arm64 --platform=linux/arm64 -o type=docker .
buildx build -t zhaobsh:amd64 --platform=linux/amd64 -o type=docker .

我在arm上面搭建的就不行没法运行amd64的

docker run -it zhaobsh:amd64
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
java: error while loading shared libraries: libpthread.so.0: ELF load command alignment not page-aligned

然后 arm64自己的进行验证



可以直接push操作

buildx build -t harbor.xxxx.com/library/zhaobsh  --platform=linux/arm,linux/arm64,linux/amd64 . --push

# 这个我还没测试

迁移测试

docker save zhaobsh:amd64 |gzip > zhaobsh_amd64.tgz 
然后在amd64的机器上面进行验证. 

也可以使用如下命令进行检查具体的架构信息: 

[root@auto02 docker]# docker inspect zhaobsh:amd64 |grep Architecture
        "Architecture": "amd64",
[root@auto02 docker]# docker inspect zhaobsh:arm64 |grep Architecture
        "Architecture": "arm64",
[root@auto02 docker]# 

与使用buildx在x86机器上面编译arm64架构的Docker镜像相似的内容:

使用buildx在x86机器上面编译arm64架构的Docker镜像

buildx 多架构编译 安装docker 下载docker 下载buildx 安装架构支持 docker run --privileged --rm tonistiigi/binfmt --install all 创建一个自己的空间 buildx create --use --name mybui

[转帖]docker使用buildx构建多平台(x86,arm64)构架镜像

https://blog.csdn.net/atzqtzq/article/details/128583331 配置文件激活buildx docker目前使用版本为Server Version: 20.10.7,添加配置支持buildx docker版本较低时,请升级docker版本 $ vim /

[转帖]--build=arm-linux

今天在arm上用configure生成makefile时报错:configure: error: cannot guess build type; you must specify one 问题: 不能确定编译的操作系统 解决: 在gcc编译中我们使用 ./configure --build=编译平

vue项目打包,解决静态资源无法加载和路由加载无效(404)问题

打包后的项目静态资源无法使用,导致页面空白 静态资源无法使用,那就说明项目打包后,图片和其他静态资源文件相对路径不对,此时找到config里面的index.js,在build模块下加入assetsPublicPath: './', 如下图所示, 在History模式下配合使用nginx运行打包后的项

面试官:说一说如何优雅的关闭线程池,我:shutdownNow,面试官:粗鲁!

写在开头 面试官:“小伙子,线程池使用过吗,来聊一聊它吧!” 我:“好的,然后巴拉巴拉一顿输出之前看过的build哥线程池十八问...” 面试官满意的点了点头,紧接着问道:“那你知道如何优雅的关闭线程池吗?” 我:“知道知道,直接调用shutdownNow()方法就好了呀!” 面试官脸色一变,微怒道

一次惨痛的面试:“网易提前批,我被虚拟线程问倒了”

一、写在开头 昨晚收到一个粉丝在私信的留言如下: build哥,今天参加了网易的提前批,可以说是一次惨痛的面试体验,直接被虚拟线程问倒了,无论是在校学习的时候还是在公司实习的时候,都使用的是Java8更多,或者Java11,比较点子背的是面试我的这一个面试官,他们团队刚好在做Java21的切换,

Nodejs 命令行调用 exec 与 spawn 差异

Nodejs 命令行调用 exec 与 spawn 差异 比如在前端工程项目中 Nodejs 要调用命令行命令如: yarn electron:build exec 调用 yarn 命令,为了能使命令行能实时打印输出正在编译的命令 以异步形式调用 exec 使用 stdout.on 方式监听标准输出

Asp-Net-Core开发笔记:FrameworkDependent搭配docker部署

## 前言 之前我写过一篇使用 docker 部署 AspNetCore 应用的文章,这种方式搭配 CICD 非常方便, build 之后 push 到私有的 dockerhub ,在生产服务器上 pull 下来镜像就可以直接运行了。 然而,有时需要一种更传统的部署方式,比如在本地打包可执行文件之后

微软在Microsoft Build 2024 上 发布了.NET 9 预览版4

在 Microsoft Build 2024 上,与往年一样,.NET 不是会议主题演讲的主题,但是微软在这个大会上为.NET 推出一组新的功能和工具,旨在使 .NET 开发更快、更轻松,具体内容可以阅读文章:Microsoft Build 2024 的 .NET 公告和更新[1]。最新功能都在.N

微软Build 2023两大主题:Copilots和插件

在本周大型微软人工智能 2023 开发者大会的开幕式上,人工智能站到了舞台中央——前台和后台以及介于两者之间的所有舞台。 贯穿会议的两个主要主题是Copilots - 涵盖广泛产品和服务的AI助手 - 以及插件,它们有效地将Copilots转变为聚合器,可能使其成为企业和消费者客户的一站式商店。 微