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 文件,所以它目前会混淆构建包。
有几个解决方案:
Tell Gradle to not build the non-executable JAR。 buildpack 需要可执行 JAR。您可以通过将以下内容添加到 build.gradle
文件来执行此操作:
jar {
enabled = false
}
这是我们的解决方案 used in the Paketo buildpack samples。
如果您不想进行 #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
文件,因为它不可执行。
我有一个非常简单的 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 文件,所以它目前会混淆构建包。
有几个解决方案:
Tell Gradle to not build the non-executable JAR。 buildpack 需要可执行 JAR。您可以通过将以下内容添加到
build.gradle
文件来执行此操作:jar { enabled = false }
这是我们的解决方案 used in the Paketo buildpack samples。
如果您不想进行 #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
文件,因为它不可执行。