Spring Boot DevTools используется внутри контейнера докеров даже после исключения в сборке Gradle

Итак, мы используем Spring boot для доставки нашего приложения. Мы используем плагин Jib для мониторинга создания образов докеров и их запуска. Мы используем gradle для сборки проекта, и инструменты разработчика идентифицируются как developmentOnly зависимость. Как упоминалось в весенних документах по адресу https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-devtools.

Однако, когда он запускается в контейнере в продукте, я все еще вижу, что он время от времени перезапускается. Мой вопрос в том, действительно ли конфигурация gradle не исключает его из упаковки. Нужно ли мне явно устанавливать параметр -Dspring.devtools.restart.enabled=false?

Решение :

Оказывается, это был плагин gradle jib для игр. В то время как в документации Spring рассказывается о том, как удалить зависимость от проекта загрузки Gradle Spring. Техника указания developmentOnly помогает только сказать gradle игнорировать инструменты разработчика. Плагин jib gradle имеет собственное мнение.

Он включает все jar-файлы при создании образа докера, и нет никакого способа исключить jar-файлы. Единственный разумный способ - настроить плагин gradle jib в build.gradle, чтобы написать это,

 jib {
    from {
        image 'gcr.io/distroless/java:11'
    }
    container {
        jvmFlags = ['-Xms1G', '-Xmx1G', '-Dspring.devtools.restart.enabled = false']
    }
}

Это гарантирует, что даже если jar включен, среда контейнера позаботится о перезапуске.

Ссылка: https://github.com/spring-projects/spring-boot/issues/15382


person Som Bhattacharyya    schedule 07.04.2020    source источник
comment
Итак, я выяснил, почему это происходит, и как это исправить. Отметил в вопросе.   -  person Som Bhattacharyya    schedule 07.04.2020


Ответы (3)


Здесь действительно есть несколько проблем:

  1. Springboot имеет свои собственные пользовательские определения вместо использования того, что было бы эквивалентом профилей. Их подход лучше всего подходит для пользователей Springboot, но его довольно сложно интегрировать с учетом всей их пользовательской логики.
  2. Jib не может знать все кастомные реализации каждого фреймворка.

Я действительно думаю, что вам следует делать что-то вроде этого:

dependencies {
  if (System.getProperty("development") == true) {
    // include the springboot devtool dependency
  }
}

Если вы хотите запустить или собрать в режиме разработки, просто сделайте

./gradlew whateverTask -Ddevelopment=true
person loosebazooka    schedule 09.04.2020

Вы можете добиться этого, установив spring.devtools.restart.enabled=false в application.properties или в свойствах вашего конкретного профиля, например. application-cloud.properties. Сообщите мне, если это сработает.

person Martino Nikolovski    schedule 07.04.2020
comment
Хотя это действительно работает, оно по-прежнему включает зависимость в вашем контейнере, которая кажется менее оптимальной. Интересно, подвергнет ли это нас потенциальной атаке, если кто-то забудет отключить spring.devtools? - person loosebazooka; 10.04.2020

Ну, недавно столкнулся с той же проблемой, и кажется, что уже есть очень простой способ ее решить.

Проблема

Jib на самом деле рассматривает spring-boot-devtools как зависимость времени выполнения и поэтому добавляет ее в образ. В моем случае это также верно для jar-файла базы данных h2, который используется только локально для разработки. Кроме того, я не хотел бы иметь дело с какими-либо дополнительными настраиваемыми параметрами в моей сборке, а также не отключать функции по конфигурации, если я действительно не хочу, чтобы они были доступны в производственной среде.

Решение

Команда GoogleContainerTools выпустила расширение jib для непосредственного решения проблемы с инструментами разработчика. Есть Gradle и Maven версия и работает безотказно.

Однако в соответствии с моими потребностями (также исключая h2) я решил использовать расширение фильтра слоя jib, чтобы сохранить мой образ как можно ближе к bootJar.

Вот фрагмент кода в Gradle:

// should be at the top of build.gradle
buildscript {
    dependencies {
        classpath('com.google.cloud.tools:jib-layer-filter-extension-gradle:0.1.0')
    }
}
jib {
    // ...
    pluginExtensions {
        pluginExtension {
            implementation = 'com.google.cloud.tools.jib.gradle.extension.layerfilter.JibLayerFilterExtension'
            configuration {
                filters {
                    filter {
                        glob = '**/h2-*.jar'
                    }
                    filter {
                        glob = '**/spring-boot-devtools-*.jar'
                    }
                }
            }
        }
    }
}

Проверьте здесь Gradle и Maven версия для этого расширения.

person Reginaldo Santos    schedule 10.12.2020