You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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复制到容器:

  1. 修改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'
  1. 简化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:20:57