0

我有一个非常简单的 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显示了三个进程。

有任何想法吗?

4

1 回答 1

0

我看不到您的构建输出,但听起来您遇到了一个已知问题。如果这不是您的问题,请包含 running 的完整输出pack build


到这个问题上。默认情况下,Spring Boot Gradle 项目将构建可执行和不可执行的 JAR。因为这会产生两个 JAR 文件,所以它目前会混淆 buildpack。

有几个解决方案:

  1. 告诉 Gradle 不要构建不可执行的 JAR。buildpack 需要可执行的 JAR。您可以通过将以下内容添加到build.gradle文件中来执行此操作:

    jar {
        enabled = false
    }
    

    这是我们在 Paketo buildpack 示例中使用的解决方案。

  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 样式的模式匹配,但您需要确保您输入的内容不匹配*-plain.jar。这将是默认构建的不可执行的 JAR。

    这个选项只是简单地告诉 Gradle buildpack 更具体的 JAR 文件传递​​给后续 buildpacks。

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

于 2022-02-28T13:59:47.973 回答