在Google Cloud Run部署Java Socket应用Docker镜像遇执行格式错误求助
问题描述
- 本地构建的Java Socket应用Docker镜像运行正常,但部署到Google Cloud Run时启动失败,错误日志如下:
{ "textPayload": "terminated: Application failed to start: Failed to create init process: failed to load /usr/lib/jvm/java-17-openjdk//bin/java: exec format error", "insertId": "631891ef0005eae9ece915df", "resource": { "type": "cloud_run_revision", "labels": { "project_id": "cumulus-0", "service_name": "cumulus", "revision_name": "cumulus-00001-hib", "location": "asia-south1", "configuration_name": "cumulus" } }, "timestamp": "2022-09-07T12:43:27.387764458Z", "severity": "ERROR", "labels": { "instanceId": "00c527f6d4880e8a5a96fbdadc4536870f1e55a884c529efc6f860386bb3766d594380d65a657a35adebed119b05e2007cbef26928db216236f1641e97b306" }, "logName": "projects/cumulus-0/logs/run.googleapis.com%2Fvarlog%2Fsystem", "receiveTimestamp": "2022-09-07T12:43:27.390641080Z" }
- 核心错误:
terminated: Application failed to start: Failed to create init process: failed to load /usr/lib/jvm/java-17-openjdk//bin/java: exec format error - 已知该错误通常因JVM不支持运行平台导致,但镜像在本地正常运行,疑惑问题根源,提供的Dockerfile如下:
FROM alpine:latest RUN apk update && \ apk add openjdk17-jre=17.0.4.1_p1-r0 ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk LABEL in.rainycloud.cumulus="hi@shantanubanerjee.com" COPY build/libs/cumulus*.jar /usr/lib/ CMD ["/usr/lib/jvm/java-17-openjdk/bin/java", "-jar", "/usr/lib/cumulus-v0.1.jar", "in.rainycloud.cumulus.Main"] EXPOSE 33333/tcp
解决方案
- 问题根源:本地构建镜像的CPU架构与Cloud Run运行环境不匹配。Cloud Run默认使用x86_64架构,若你在ARM架构设备(如M系列Mac)上构建镜像,Alpine会默认拉取ARM版本的openjdk17-jre,导致镜像在x86_64环境下无法执行,触发exec format error。
- 修复方案:
- 构建镜像时指定目标架构为x86_64,强制生成兼容Cloud Run的镜像:
推送镜像到Google镜像仓库时,确保推送的是该指定架构的版本。docker build --platform linux/amd64 -t cumulus . - 替换为支持多架构的官方Java镜像,自动适配目标环境,无需手动指定架构:
修改后的Dockerfile:FROM eclipse-temurin:17-jre-alpine ENV JAVA_HOME=/opt/java/openjdk LABEL in.rainycloud.cumulus="hi@shantanubanerjee.com" COPY build/libs/cumulus*.jar /usr/lib/ CMD ["java", "-jar", "/usr/lib/cumulus-v0.1.jar", "in.rainycloud.cumulus.Main"] EXPOSE 33333/tcp
- 构建镜像时指定目标架构为x86_64,强制生成兼容Cloud Run的镜像:
- 补充说明:Docker的
--platform参数可强制构建指定架构的镜像,即使本地是ARM环境,Docker会通过QEMU模拟x86_64环境完成构建,确保镜像能在Cloud Run的x86_64实例上正常运行。
内容的提问来源于stack exchange,提问作者bradley101
相关产品推荐
相关产品推荐

