Есть ли какие-либо пакеты сборки, которые генерируют оптимизированные образы OCI Spring Webflux?
Я не могу найти сборщик пакетов, который подходит для приложений Spring Webflux. В пакете, например, мало места для настройки, и он из коробки включает пакеты сборки, которые не нужны для типичного приложения Webflux (например, apache-tomcat). Существуют ли какие-либо пакеты сборки, предназначенные для приложений, реагирующих на webflux/jvm?
0 ответов
Не похоже, что вам нужно делать что-то конкретное здесь для Spring Webflux, CNB, связанные с Java, просто будут делать правильные вещи.
Я взял образец приложения, созданный с помощью 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"},
},
},
},
}
Причина, по которой это нормально, заключается в том, что во время сборки Tomcat CNB немедленно выйдет (не работает), если нет
WEB-INF
каталог, а для приложения 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 работал и выполнял какую-либо работу, вы бы увидели этот строковый вывод.
CNB paketo-buildpack / dist-zip работает точно так же, он просто ищет
<APPLICATION_ROOT>/*/bin/*
существовать.
Таким образом, создаваемое изображение должно быть специфичным для вашего приложения и не должно содержать ненужного. Если вы используете Spring WebFlux, вам не следует устанавливать Tomcat в свой образ. Кроме того, вы получаете все оптимизации, обеспечиваемые с помощью пакетов сборки Cloud Native.