我想实现以下目标:将我的Spring Boot应用程序打包到Dockerimage中,在那里我可以调用npx命令,以便调用我的应用程序中需要的第三方节点库。
我的Pom是这样的:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>build-image</goal>
</goals>
</execution>
</executions>
<configuration>
<image>
<name>my-app</name>
<buildpacks>
<buildpack>gcr.io/paketo-buildpacks/nodejs</buildpack>
<buildpack>gcr.io/paketo-buildpacks/java</buildpack>
</buildpacks>
</image>
</configuration>
</plugin>
</plugins>
</build>
现在有了mvn包,插件将被执行,但首先:它将失败并出现错误:
加载图像时收到无效响应"pack.local/builder/ayvwrfbfbm:latest">
但是,如果我通过打包开始整个过程,则会创建图像
pack build my-app --builder paketobuildpacks/builder:base --buildpack paketo-buildpacks/nodejs --buildpack paketo-buildpacks/java
但在创建的图像中,我不能调用node、npm或npx,因为这些层似乎没有添加到那里。
如果我在我的AppRoot中添加一个package.json和一个server.js,似乎添加了npm安装层,但我仍然无法从容器中调用node、npm或npx。
请有人告诉我如何创建一个运行春季启动应用程序的映像,然后可以通过调用第三方npm-cli
Runtime.getRuntime().exec("npx my3rdParty-cli");
一些注意事项。
-
当您添加两个像
--buildpack paketo-buildpacks/nodejs --buildpack paketo-buildpacks/java
这样的构建包时,并不意味着它们都会运行。两者都会检查您的代码并确定它们是否可以运行,这就是所谓的检测过程,但最终只有您设置的两个构建包组中的一个会被选中来构建您的应用程序。当你在顶部运行构建时,它会打印一个选择执行的构建包列表,这样你就可以准确地看到正在执行的内容。
===> DETECTING 6 of 24 buildpacks participating paketo-buildpacks/ca-certificates 3.2.4 paketo-buildpacks/bellsoft-liberica 9.4.0 paketo-buildpacks/syft 1.13.0 paketo-buildpacks/executable-jar 6.2.4 paketo-buildpacks/dist-zip 5.2.4 paketo-buildpacks/spring-boot 5.13.0 ...
-
现在,Node.js构建包和Java构建包是分开的,所以你要么得到其中一个。这就是为什么它默认运行Java,但如果添加
package.json
文件,它会运行Node.js。它们是相互独立的。将Node.js添加到Java构建包组中以支持这样的用例是一个悬而未决的问题。
-
如果你试图在构建时使用Node.js/NPM,你可以在这里的演示中使用Maven插件来安装Node.js。如果你需要构建前端并将其与Java应用程序捆绑在一起,它就会可用。
-
如果您在运行时确实需要Node.js/NPM,那么这是一个更棘手的问题。3.(不会那样做。您需要将Node.js安装到实际运行时容器中的东西。得到2.(的支持可以做到这一点,但与此同时,还有一些选择。特别是选项4.(。您可以使用apt-buildpack安装Node.js,然后从Java应用程序调用它。