我找不到适合Spring Webflux应用程序的buildpack构建器。例如,Paketo几乎没有自定义空间,并且开箱即用,包括典型Webflux应用程序(例如apache-tomcat(不需要的构建包。是否有任何为 webflux/jvm-reactive 应用程序量身定制的构建包?
看起来你不需要为Spring Webflux做任何具体的事情,与Java相关的CNB只会做正确的事情。
我拿了一个使用 Spring 初始值设定项创建的示例应用程序(刚刚添加了 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 CNB,这是意料之中的。Tomcat CNB 总是会返回成功的检测。
请注意pass
如何硬编码为 true。
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 将立即退出(no-op(,而对于 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 %sn%w", file, err)
} else if os.IsNotExist(err) {
return libcnb.BuildResult{}, nil
}
您可以通过查看pack build
的完整输出并查找是否存在Paketo Apache Tomcat Buildpack x.x.x
(其中 x.x.x 是版本号(来确认这一点。如果Tomcat CNB正在运行并执行任何工作,您将看到该行输出。
paketo-buildpack/dist-zip CNB的工作方式相同,它只是在寻找<APPLICATION_ROOT>/*/bin/*
存在。
因此,总而言之,生成的图像应特定于您的应用程序,并且不应包含不必要的内容。如果您运行的是Spring WebFlux,则不应将Tomcat安装到映像中。此外,您还可以获得使用云原生构建包提供的所有优化。