Spring Boot应用构建成功后在Cloud Run容器中无法启动:无法访问jar包
问题分析与解决方案
核心原因
你遇到的启动失败本质是容器内找不到指定的Jar文件——你的Dockerfile仅将源码复制到容器,但没有执行Maven/Gradle打包命令生成Jar,导致/app/target/educity-manager-0.0.1-SNAPSHOT.jar路径完全不存在。Cloud Build日志显示"构建成功"只是因为Dockerfile的命令都执行完毕,并非Jar包已生成。
方案1:Docker多阶段构建(推荐)
多阶段构建能在镜像构建阶段完成代码打包,仅将最终生成的Jar复制到运行容器,既缩小镜像体积,又确保Jar文件存在。
Maven项目示例Dockerfile:
# 第一阶段:用Maven镜像完成代码打包 FROM maven:3.8.6-openjdk-17 AS builder WORKDIR /app COPY pom.xml . COPY src ./src # 执行打包(跳过测试加快构建) RUN mvn clean package -DskipTests # 第二阶段:用轻量JDK镜像运行应用 FROM openjdk:17-jdk-alpine RUN addgroup -S spring && adduser -S spring -G spring USER spring:spring # 从构建阶段复制生成的Jar到当前容器 COPY --from=builder /app/target/educity-manager-0.0.1-SNAPSHOT.jar /app/app.jar ENTRYPOINT ["java","-jar","/app/app.jar"]
Gradle项目示例Dockerfile:
# 第一阶段:用Gradle镜像完成代码打包 FROM gradle:7.6-jdk17 AS builder WORKDIR /app COPY build.gradle settings.gradle ./ COPY src ./src RUN gradle bootJar -x test # 第二阶段:用轻量JDK镜像运行应用 FROM openjdk:17-jdk-alpine RUN addgroup -S spring && adduser -S spring -G spring USER spring:spring COPY --from=builder /app/build/libs/educity-manager-0.0.1-SNAPSHOT.jar /app/app.jar ENTRYPOINT ["java","-jar","/app/app.jar"]
方案2:调整Cloud Build流程先打包
如果不想修改多阶段构建,可让Cloud Build先在外部完成打包,再将生成的Jar复制到容器:
- 修改Cloud Build配置文件
cloudbuild.yaml,先执行打包命令:
steps: # 第一步:用Maven打包生成Jar - name: 'maven:3.8.6-openjdk-17' args: ['clean', 'package', '-DskipTests'] # 第二步:构建Docker镜像 - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/$PROJECT_ID/your-image-name', '.'] images: - 'gcr.io/$PROJECT_ID/your-image-name'
- 简化Dockerfile,仅复制打包好的Jar:
FROM openjdk:17-jdk-alpine RUN addgroup -S spring && adduser -S spring -G spring USER spring:spring COPY target/educity-manager-0.0.1-SNAPSHOT.jar /app/app.jar ENTRYPOINT ["java","-jar","/app/app.jar"]
额外检查点
- 确认Jar文件名:打包时可能生成带
-plain后缀的Jar,或版本号与Dockerfile中不一致,可查看Cloud Build打包步骤的日志确认实际文件名。 - 端口配置无需调整:
server.port=${PORT:8080}的配置是正确的,Cloud Run会自动注入PORT环境变量,只要Jar能正常启动,端口监听就会正常。
内容的提问来源于stack exchange,提问作者Nick Siepmann
相关产品推荐
相关产品推荐

