簡體   English   中英

Spring 引導 DevTools 在 docker 容器中使用,即使在 gradle 構建中排除后

[英]Spring Boot DevTools being used inside docker container even after exclusion in gradle build

所以我們使用 Spring 引導來交付我們的應用程序。 我們使用 Jib 插件來監控創建 docker 圖像並運行它們。 我們使用 gradle 來構建項目,並且開發工具被標識為developmentOnly依賴項。 正如https://docs.spring.io/spring-boot/docs.current/reference-boot-html/tools-springusing

但是,當它在 prod 的容器中運行時,我仍然會看到它時不時地重新啟動。 我的問題是 gradle 配置並沒有真正將其從包裝中排除。 我是否需要明確設置-Dspring.devtools.restart.enabled=false參數?

解決方案:

原來是gradle jib插件玩游戲。 雖然 spring 文檔是關於如何 go 關於從 gradle Z2A2D5927E514B24D06 項目中刪除依賴項的問題。 指定developmentOnly的技術僅有助於告訴 gradle 忽略開發工具。 jib gradle 插件有自己的想法。

在構建 docker 映像時,它包括所有 jars,並且無法排除任何 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

您可以通過在application.properties或特定的配置文件屬性中設置spring.devtools.restart.enabled=false來實現這一點。 application-cloud.properties 讓我知道這個是否奏效。

這里確實有幾個問題:

  1. Springboot 有自己的自定義定義,而不是使用相當於配置文件的定義。 他們的方法最適合 springboot 用戶,但很難與他們所有的自定義邏輯集成。
  2. Jib 無法知道每個框架的所有自定義實現。

我真的認為你應該做的是這樣的:

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

當您想在開發模式下運行或構建時,只需執行

./gradlew whateverTask -Ddevelopment=true

好吧,最近剛遇到同樣的問題,似乎已經有一種非常直接的方法來解決它。

問題

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版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM