我找不到适合 Spring Webflux 应用程序的 buildpack 构建器。例如,Paketo 几乎没有定制空间,而且开箱即用的构建包包括典型的 Webflux 应用程序(例如 apache-tomcat)不需要的构建包。是否有为 webflux/jvm-reactive 应用程序量身定制的构建包?
1 回答
看起来你不需要为 Spring Webflux 做任何具体的事情,Java 相关的 CNB 会做正确的事情。
我拿了一个使用 Spring Initializer 创建的示例应用程序(刚刚添加了 Webflux 启动器)并pack build
针对它运行(如果你运行./mvnw spring-boot:build-image
,你应该得到非常相似的输出)。
这给了我以下输出:
===> DETECTING
[detector] 6 of 17 buildpacks participating
[detector] paketo-buildpacks/bellsoft-liberica 3.2.0
[detector] paketo-buildpacks/maven 3.1.0
[detector] paketo-buildpacks/executable-jar 3.1.0
[detector] paketo-buildpacks/apache-tomcat 2.2.0
[detector] paketo-buildpacks/dist-zip 2.2.0
[detector] paketo-buildpacks/spring-boot 3.2.0
乍一看,这可能看起来很奇怪。为什么Tomcat在那里?看看 Tomcat CNB,这是意料之中的。Tomcat CNB 总是会返回一个成功的检测。
请注意如何pass
硬编码为真。
result := libcnb.DetectResult{
Pass: true,
Plans: []libcnb.BuildPlan{
{
Requires: []libcnb.BuildPlanRequire{
{Name: "jre", Metadata: map[string]interface{}{"launch": true}},
{Name: "jvm-application"},
},
},
},
}
之所以可以,是因为在构建时,如果没有WEB-INF
目录,Tomcat CNB 将立即退出(无操作),而对于 Spring WebFlux 应用程序则不会。
file := filepath.Join(context.Application.Path, "WEB-INF")
if _, err := os.Stat(file); err != nil && !os.IsNotExist(err) {
return libcnb.BuildResult{}, fmt.Errorf("unable to stat file %s\n%w", file, err)
} else if os.IsNotExist(err) {
return libcnb.BuildResult{}, nil
}
您可以通过查看完整输出pack build
并查找是否存在Paketo Apache Tomcat Buildpack x.x.x
(其中 xxx 是版本号)来确认这一点。如果 Tomcat CNB 正在运行并执行任何工作,您会看到该行 output。
paketo-buildpack/dist-zip CNB 的工作方式相同,它只是在寻找<APPLICATION_ROOT>/*/bin/*
存在。
所以总而言之,生成的图像应该特定于您的应用程序,并且不应包含不必要的内容。如果您正在运行 Spring WebFlux,那么您不应该将 Tomcat 安装到您的映像中。此外,您还可以获得使用 Cloud Native buildpacks 提供的所有优化。