M1 Mac构建Quarkus Native Image Docker镜像运行报exec format error求助
问题分析与解决
核心问题
你遇到的exec ./application: exec format error是架构不匹配导致的:
- 你的M1 Mac是ARM64架构,但当前使用的GraalVM是x86_64版本(终端通过Rosetta运行x86模式),步骤3生成的
target/application是x86_64格式的原生程序。 - 步骤5的Docker构建直接复制了本地的x86_64程序到镜像中,而M1的Docker默认运行在ARM64环境,无法执行x86格式的二进制文件。
解决步骤
方案1:构建ARM64原生镜像(推荐,适配M1架构)
- 替换为ARM64版本的GraalVM
卸载当前x86版本的GraalVM,下载安装适配ARM64的GraalVM CE(版本22.1.0或更高)。 - 切换终端到ARM64模式
关闭现有终端,右键点击终端图标 → 选择"新建窗口"(不要勾选"使用Rosetta打开")。 - 重新构建原生程序
./mvnw clean package -Pnative - 修改Dockerfile适配ARM64
编辑src/main/docker/Dockerfile.native,将基础镜像替换为ARM64版本:# 替换原基础镜像 FROM quay.io/quarkus/quarkus-micro-image:2.0-arm64 WORKDIR /work/ RUN chown 1001 /work \ && chmod "g+rwX" /work \ && chown 1001:root /work COPY --chown=1001:root target/application /work/application EXPOSE 8080 USER 1001 CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] - 构建并运行Docker镜像
docker build -f src/main/docker/Dockerfile.native -t quarkus/quarkus-project . docker run -i --rm -p 8080:8080 quarkus/quarkus-project
方案2:强制Docker以x86_64模式运行(无需更换GraalVM)
如果暂时不想更换GraalVM,可以让Docker通过Rosetta模拟x86环境:
- 构建镜像时指定平台
docker build --platform linux/amd64 -f src/main/docker/Dockerfile.native -t quarkus/quarkus-project . - 运行容器时指定平台
docker run --platform linux/amd64 -i --rm -p 8080:8080 quarkus/quarkus-project
方案3:使用Quarkus内置的Docker构建能力(避免手动复制错误)
Quarkus的-Dnative-image.docker-build=true参数会直接在Docker内构建原生镜像并生成Docker镜像,无需手动执行docker build:
- 执行内置构建
./mvnw clean package -Pnative -Dnative-image.docker-build=true -Dquarkus.native.container-build=true - 直接运行生成的镜像
命令执行完成后,直接运行Quarkus生成的镜像(默认镜像名格式为groupId/artifactId:version)即可。
内容的提问来源于stack exchange,提问作者ankit dadhich
相关产品推荐
相关产品推荐

