1

所以我们使用 Spring boot 来交付我们的应用程序。我们使用 Jib 插件来监控创建 docker 镜像并运行它们。我们使用 gradle 来构建项目,并且开发工具被标识为developmentOnly依赖项。正如在https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-devtools的 spring 文档中提到的那样。

但是,当它在 prod 的容器中运行时,我仍然会看到它时不时地重新启动。我的问题是 gradle 配置并没有真正将它从包装中排除。我需要明确设置-Dspring.devtools.restart.enabled=false参数吗?

解决方案 :

原来是玩游戏的 gradle jib 插件。虽然 spring 文档是关于如何从 gradle spring boot 项目中删除依赖关系的。指定 a developmentOnlyonly 的技术有助于告诉 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

4

3 回答 3

2

您可以通过设置spring.devtools.restart.enabled=falseapplication.properties或您的特定配置文件属性来实现这一点。application-cloud.properties. 让我知道这个是否奏效。

于 2020-04-07T07:22:33.653 回答
2

这里确实有几个问题:

  1. Springboot 有自己的自定义定义,而不是使用相当于配置文件的定义。他们的方法最适合 springboot 用户,但很难与他们所有的自定义逻辑集成。
  2. Jib 无法知道每个框架的所有自定义实现。

我真的认为你应该做的是这样的:

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

当您想在开发模式下运行或构建时,只需执行

./gradlew whateverTask -Ddevelopment=true
于 2020-04-09T23:33:19.097 回答
0

好吧,最近刚遇到同样的问题,似乎已经有一种非常直接的方法来解决它。

问题

Jib 实际上将 spring-boot-devtools 视为运行时依赖项,因此将其添加到映像中。就我而言,这对于仅在本地用于开发的 h2 数据库 jar 也是如此。此外,我不想在我的构建中处理任何额外的自定义参数,如果我真的不希望它们在生产中可用,也不会通过配置关闭功能。

解决方案

GoogleContainerTools 的团队已经发布了一个 jib-extension 来直接处理 devtools 问题。有一个GradleMaven版本,它可以完美运行。

但是,根据我的需要(也不包括 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'
                    }
                }
            }
        }
    }
}

在此处查看此扩展的GradleMaven版本。

于 2020-12-10T16:35:22.447 回答