Docker容器内构建GraalVM应用失败求助
问题分析
Exit code 137 本质是进程因内存不足被系统强制杀死,GraalVM 的 native-image 工具在构建原生镜像时需要大量内存,而 Docker 容器默认分配的内存配额不足以支撑这个过程——你本地构建正常是因为本地 JVM 可以使用更多系统内存,容器内则受限于 Docker 的资源限制。
解决方案
1. 调整 Docker Desktop 的内存分配
打开 Docker Desktop → 点击右上角设置图标 → 选择「Resources」→「Advanced」,将内存分配调整至至少 8GB(推荐 16GB 以上,如果系统内存允许),保存后重启 Docker。
2. 构建时强制指定容器内存
执行 docker build 命令时,通过参数给构建容器分配足够内存:
docker build --memory=8g --memory-swap=8g -t your-image-name .
--memory-swap=8g 会关闭内存交换,避免因交换导致的性能下降和内存溢出。
3. 给 native-image 工具分配更多 JVM 内存
在 Gradle 配置中直接给 native-image 工具指定内存参数:
- 修改项目根目录的
build.gradle(或build.gradle.kts),添加:
tasks.withType(org.graalvm.buildtools.gradle.NativeCompileTask) { args += ["-J-Xmx6g"] // 给 native-image 底层的 JVM 分配 6GB 内存 }
- 或者在构建命令中临时传递参数:
./gradlew nativeCompile --no-daemon -Pnative.image.buildArgs=-J-Xmx6g
4. 确保镜像架构匹配(M1 专属)
M1 是 arm64 架构,需确保使用的 GraalVM 镜像为对应架构版本,避免跨架构模拟(QEMU)额外消耗内存:
修改 Dockerfile 的 base 镜像行:
FROM --platform=linux/arm64 ghcr.io/graalvm/graalvm-community:21 as base
5. 优化构建上下文(可选)
将 COPY . . 替换为只拷贝构建必需的文件,减少不必要的文件传输,提升构建效率:
FROM --platform=linux/arm64 ghcr.io/graalvm/graalvm-community:21 as base WORKDIR /app COPY build.gradle settings.gradle ./ COPY src ./src COPY gradle ./gradle COPY gradlew ./
内容的提问来源于stack exchange,提问作者Saul Eiros
相关产品推荐
相关产品推荐

