java/spring-boot/gradle 使用 pack 和 paketobuildpacks/builder:base 构建的图像中的错误入口点

java/spring-boot/gradle Wrong Entrypoint in image built with pack and paketobuildpacks/builder:base

我有一个非常简单的 java spring-boot gradle 应用程序。 当我从源构建图像时:

pack build testapp:0.0.1 --builder paketobuildpacks/builder:base

并尝试 运行 它与 docker 我得到以下错误:

ERROR: failed to launch: determine start command: when there is no default process a command is required.

此图像中生成的入口点是 "/cnb/lifecycle/launcher"

当我用 pack inspect-image 检查图像时,没有进程。

我用不同的 java spring-boot gradle 应用程序进行了尝试。当我使用“bootBuildImage”gradle 任务时,它的作用几乎相同,但使用预构建的 .jar 文件并且生成的图像有效。此图中生成的入口点是 "/cnb/process/web"pack inspect-image 显示了三个进程。

有什么想法吗?

我看不到你的构建输出,但听起来你遇到了一个已知问题。如果这 不是 您的问题,请包括 运行 pack build.

的完整输出

进入正题。默认情况下,Spring Boot Gradle 项目将构建可执行文件和 non-executable JAR。因为这会产生两个 JAR 文件,所以它目前会混淆构建包。

有几个解决方案:

  1. Tell Gradle to not build the non-executable JAR。 buildpack 需要可执行 JAR。您可以通过将以下内容添加到 build.gradle 文件来执行此操作:

    jar {
        enabled = false
    }
    

    这是我们的解决方案 used in the Paketo buildpack samples

  2. 如果您不想进行 #1 中建议的更改,则可以将以下参数添加到 pack build-e BP_GRADLE_BUILT_ARTIFACT=build/libs/<your-jar>.jar。例如:-e BP_GRADLE_BUILT_ARTIFACT=build/libs/demo-0.0.1-SNAPSHOT.jar。这里可以使用glob-style模式匹配,但需要确保输入的内容不匹配*-plain.jar。这将是默认构建的 non-executable JAR。

    此选项只是简单地告诉 Gradle 构建包,更具体地说,将什么 JAR 文件传递​​给后续构建包。

我们还有一个未解决的问题应该有助于缓解这个问题。当 executable-jar buildpack gains support for multiple JARs 时,您不太可能需要设置它。本质上,此填充将添加支持,因此 executable-jar buildpack 可以检查和检测可执行 JAR,这将允许它丢弃 -plain.jar 文件,因为它不可执行。