使用pack build构建Spring Boot镜像遇404,bootBuildImage则正常
解决pack build构建Spring Boot WAR镜像出现Tomcat 404的问题
核心解决方案
让pack build和./gradlew bootBuildImage使用完全一致的Buildpack集合,有两种实现方式:
方式1:命令行直接指定
执行pack build时,显式指定Spring Boot专属Buildpack,避免自动选择多余的gradle、apache-tomcat Buildpack:
pack build <你的镜像名称> --builder paketobuildpacks/builder-jammy-base:latest --buildpack gcr.io/paketo-buildpacks/spring-boot
方式2:固化配置到项目文件
在项目根目录创建project.toml,写入以下内容,后续直接执行pack build <你的镜像名称>即可:
[build] builder = "paketobuildpacks/builder-jammy-base:latest" buildpacks = ["gcr.io/paketo-buildpacks/spring-boot"]
问题根源
bootBuildImage是Spring Boot Gradle插件封装的命令,它会自动适配Spring Boot项目,只加载Spring Boot专属Buildpack——这个Buildpack会把WAR包嵌入到Spring Boot自带的嵌入式Tomcat中,确保DemoController的路径能被正确识别。- 原生
pack build默认会扫描所有可用Buildpack,误选了gradle Buildpack(用于源码构建)和独立apache-tomcat Buildpack(用于传统WAR部署)。独立Tomcat部署时会将WAR包解压到特定上下文路径,导致根路径/无法匹配到你的DemoController,出现404。
验证方法
- 构建完成后,执行
pack inspect-image <你的镜像名称>,查看Buildpack列表,确认只有Spring Boot Buildpack存在。 - 启动镜像后,检查日志,确认启动的是
org.springframework.boot.web.embedded.tomcat.TomcatWebServer,而非独立Tomcat进程。
内容的提问来源于stack exchange,提问作者Federico Nafria
相关产品推荐
相关产品推荐

