Quarkus原生应用跨架构部署报错:exec format error 求助
问题解答
跨架构直接部署可行性
这种直接将aarch64架构下构建的Quarkus原生二进制包部署到x86_64服务器运行的方式不可行。
原因是Quarkus原生构建会生成与构建平台CPU指令集强绑定的二进制文件:aarch64(ARM64)架构的二进制只能在ARM指令集的CPU上执行,而x86_64(AMD64)服务器使用的是x86指令集,两者指令集不兼容,因此会出现exec ./application: exec format error的执行格式错误。
无需目标服务器构建的替代方案
方案1:在aarch64服务器上交叉编译x86_64架构的原生二进制
利用GraalVM的交叉编译能力,在性能更强的aarch64服务器上直接编译出适配x86_64架构的原生应用:
- 安装x86_64交叉编译工具链:
apt-get update && apt-get install -y gcc-multilib g++-multilib - 执行Quarkus构建时指定目标架构(以Maven为例):
编译完成后,将生成的x86_64架构二进制包传输到目标服务器,即可正常运行。./mvnw package -Pnative -Dquarkus.native.target-arch=x86_64 -Dquarkus.native.container-build=false
方案2:基于Docker QEMU模拟的跨架构构建
通过QEMU在aarch64服务器上模拟x86_64架构,直接构建适配目标架构的Docker镜像:
- 安装并配置QEMU:
apt-get install -y qemu-user-static docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - 修改Dockerfile为多阶段构建,确保构建阶段基于x86_64架构的Quarkus原生镜像:
# 构建阶段:指定x86_64架构的Quarkus原生构建镜像 FROM --platform=linux/amd64 quay.io/quarkus/ubi-quarkus-native-image:22.3-java17 AS builder WORKDIR /project COPY . . # 执行原生构建 RUN ./mvnw package -Pnative -Dquarkus.native.container-build=true # 运行阶段:使用ubi-minimal基础镜像 FROM registry.access.redhat.com/ubi8/ubi-minimal:8.8 WORKDIR /work/ RUN chown 1001 /work \ && chmod "g+rwX" /work \ && chown 1001:root /work # 从构建阶段复制x86_64架构的二进制文件 COPY --from=builder --chown=1001:root /project/target/*-runner /work/application COPY --from=builder --chown=1001:root /project/target/*.so /work/ EXPOSE 9090 USER 1001 ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] - 构建x86_64架构的Docker镜像:
docker build --platform=linux/amd64 -t your-image-name . - 将镜像推送到私有或公共镜像仓库,x86_64服务器拉取后即可直接运行。
方案3:构建多架构Docker镜像(Manifest列表)
使用Docker Buildx构建同时支持aarch64和x86_64的多架构镜像,推送至镜像仓库后,目标服务器会自动拉取对应架构的镜像:
- 启用Docker Buildx:
docker buildx create --use - 构建并推送多架构镜像:
docker buildx build --platform linux/amd64,linux/arm64 -t your-registry/your-image:latest --push .
内容的提问来源于stack exchange,提问作者Fyruz
相关产品推荐
相关产品推荐

