繁体   English   中英

安装了 Npm 的 Spring Boot 构建映像

[英]Spring Boot build-image with Npm installed

我想实现以下目标:将我的 Spring-Boot 应用程序打包到 Dockerimage 中,我可以在其中调用 npx 命令以调用我的应用程序中需要的第 3 方节点库。

我的 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 package 插件将被执行,但首先:它将失败并出现错误:

加载图像“pack.local/builder/ayvwrfbvbm:latest”时收到无效响应

但是,如果我通过打包开始整个事情,则会创建图像

pack build my-app --builder paketobuildpacks/builder:base --buildpack paketo-buildpacks/nodejs --buildpack paketo-buildpacks/java

但是在创建的图像中,我不能调用节点,也不能调用 npm 或 npx,因为似乎这些层没有添加到那里。

如果我随后将 package.json 和 server.js 添加到我的 App-Root 中,似乎添加了 npm-install 层,但我仍然无法从容器中调用 node、npm 或 npx。

请有人可以告诉我一种方法如何创建一个运行 spring-boot 应用程序的图像,然后可以通过调用 3rd 方 npm cli

Runtime.getRuntime().exec("npx my3rdParty-cli");

一些笔记。

  1. 当您添加两个构建包时,例如--buildpack paketo-buildpacks/nodejs --buildpack paketo-buildpacks/java ,这并不意味着它们都会运行。 两者都将检查您的代码并确定它们是否可以运行,这就是所谓的检测过程,但最终只会选择您设置的两个 buildpack 组中的一个来构建您的应用程序。

    当您在顶部运行构建时,它将打印选择执行的构建包列表,因此您可以准确地看到正在执行的内容。

     ===> 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 ...
  2. 现在,Node.js buildpack 和 Java buildpack 是分开的,所以您可以选择其中一个。 这就是它默认运行 Java 的原因,但如果添加package.json文件,它会运行 Node.js。 它们彼此独立。

    将 Node.js 添加到 Java buildpack 组中存在一个未解决的问题,以便可以支持这样的用例。

  3. 如果您尝试在构建时使用 Node.js/NPM,您可以在此处的演示中执行类似操作,您可以使用 Maven 插件安装 Node.js。 如果您可能需要构建一个前端并将其与您的 Java 应用程序捆绑在一起,那么它将可用。

  4. 如果您在运行时确实需要 Node.js/NPM,这是一个更棘手的问题。 3.) 不会那样做。 您需要将 Node.js 安装到实际运行时容器中的东西。 得到 2.) 的支持可以做到这一点,但与此同时,有一些可用的选项 特别是来自该链接的选项 4.)。 您可以使用apt-buildpack安装 Node.js,然后从您的 Java 应用程序中调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM