因此,我们使用 Spring boot 来交付我们的应用程序。我们使用 Jib 插件来监控创建 docker 镜像并运行它们。
我们使用 gradle 来构建项目,并且开发工具被识别为 developmentOnly
依赖项。
正如 spring 文档中提到的 https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-devtools .
但是,当它在 prod 的容器中运行时,我仍然看到它时不时地重新启动。
我的问题是 gradle 配置是否并没有真正将其从包装中排除。
我是否需要显式设置 -Dspring.devtools.restart.enabled=false
参数?
解决方案:
原来是gradle jib插件在玩游戏。
虽然 spring 文档详细介绍了如何从 gradle spring boot 项目中删除依赖项。指定 developmentOnly
的技术仅有助于告诉 gradle 忽略开发工具。 jib gradle 插件有自己的想法。
它包含构建 docker 镜像时的所有 jar,并且无法排除任何 jar。唯一合理的办法就是在build.gradle中自定义gradle jib插件来写这个,
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
最佳答案
这里确实存在一些问题:
- Springboot 有自己的自定义定义,而不是使用与配置文件等效的内容。他们的方法最适合 springboot 用户,但很难与他们所有的自定义逻辑集成。
- Jib 无法知道每个框架的所有自定义实现。
我真的认为你应该做的是这样的:
dependencies {
if (System.getProperty("development") == true) {
// include the springboot devtool dependency
}
}
当你想在开发模式下运行或构建时,只需执行
./gradlew whateverTask -Ddevelopment=true
关于java - 即使在 gradle 构建中排除后,Spring Boot DevTools 仍在 docker 容器内使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61074597/