0

我正在创建一个项目并使用 Jib 创建容器并将它们推送到 ECR。这是一个多模块的 maven 项目,有 3 个子模块,其中 2 个是标准的 java spring-boot 项目,可以使用 Jib 正常工作,另一个是使用 mvn 构建的 npm 项目。这是它的pom。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>my-search-frontend</artifactId>
    <packaging>pom</packaging>
    <version>1.11.0-SNAPSHOT</version>
    <name>my search frontend</name>
    <description>my search frontend</description>

    <parent>
        <artifactId>my-search</artifactId>
        <groupId>com.regalo.my</groupId>
        <version>1.11.0-SNAPSHOT</version>
    </parent>

    <build>
        <finalName>my-search-frontend</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <filesets>
                        <fileset>
                            <directory>node_modules</directory>
                            <includes>
                                <include>**/*</include>
                            </includes>
                            <followSymlinks>false</followSymlinks>
                        </fileset>
                        <fileset>
                            <directory>build</directory>
                            <includes>
                                <include>**/*</include>
                            </includes>
                            <followSymlinks>false</followSymlinks>
                        </fileset>
                    </filesets>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.6.0</version>
                <executions>
                    <execution>
                        <id>npm-install</id>
                        <phase>initialize</phase>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <configuration>
                            <executable>npm</executable>
                            <arguments>
                                <argument>install</argument>
                            </arguments>
                            <workingDirectory>${project.basedir}</workingDirectory>
                        </configuration>
                    </execution>
                    <execution>
                        <id>npm-run-build</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <configuration>
                            <executable>npm</executable>
                            <arguments>
                                <argument>run</argument>
                                <argument>build</argument>
                            </arguments>
                            <workingDirectory>${project.basedir}</workingDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <configuration>
                    <skipDocker>${skip.docker}</skipDocker>
                    <imageTags>
                        <imageTag>${project.version}</imageTag>
                        <imageTag>latest</imageTag>
                    </imageTags>
                    <dockerDirectory>${project.basedir}/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/build</targetPath>
                            <directory>${project.basedir}/build</directory>
                            <include>**/*</include>
                        </resource>
                        <resource>
                            <targetPath>/build</targetPath>
                            <directory>${project.basedir}</directory>
                            <includes>
                                <include>index.html</include>
                            </includes>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <configuration>
                    <to>
                        <image>${docker.repository.host}/${project.artifactId}:${project.version}</image>
                    </to>
                    <!-- <skip>${skip.docker}</skip> -->
                    <extraDirectories>
                        <paths>
                            <path>
                                <from>${project.basedir}</from>
                                <into>/build</into>
                            </path>
                        </paths>
                    </extraDirectories>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Spotify one 是我们之前的做法,现在我们正在转向 Jib。但是我正在为这个应用程序构建解决问题,

    [ERROR] Failed to execute goal com.google.cloud.tools:jib-maven-plugin:2.7.1:build (default-cli) on project my-search-frontend: Obtaining project build output files failed; make sure you have compiled your project before trying to build the image. 
(Did you accidentally run "mvn clean jib:build" instead of "mvn clean compile jib:build"?): /home/cyrex/Documents/Sourcecode/my-search/my-search-frontend/target/classes -> [Help 1]

应用程序的项目结构

在此处输入图像描述

对此的帮助将不胜感激。

4

3 回答 3

3

Jib Maven 和 Gradle 插件适用于 Java 应用程序,错误消息是抱怨 NPM 模块中没有编译.class文件。但是,从技术上讲,您可以通过一些技巧使 Jib 构建 NPM 映像(例如,在下面放置一个虚拟对象DummyClass.javasrc/main/java绕过错误,覆盖<container><entrypoint>以不执行java,用于<extraDirectories>放置任意文件,设置<from><image>为使用非 JRE 基础图片等)。您可能还需要使用Jib Layer-Filter 扩展来删除文件。但是,由于 Jib 确实是为 Java 应用程序量身定制的,所以我不能真正推荐它。

仅供参考,Jib 可以通过Jib 扩展框架进行高度定制和扩展,因此理论上您可以编写一个 NPM Jib 扩展来涵盖这个高度专业化的工作流程(并与 Jib 社区共享)。

此外,对于非 Java 应用程序和非 Maven 工作流,我们还有其他 Jib 解决方案:Jib Core(Java 库)和Jib CLI。Jib CLI 可能在这种情况下工作,尽管它不是 Maven 插件。(我不知道这是否是个好主意,但仅供参考,似乎有几种方法可以在 Maven 中运行任意命令。)


与此相关的是,本文展示了一个示例,该示例使用 Jib 层过滤器扩展来启用 Jib 不支持的用例。

于 2021-02-23T15:16:54.120 回答
0

JIB 仅适用于 java 项目。它处理在优化层中安装 Java 运行时和依赖项。但它无法创建 NPM docker 镜像。

所以你只能为java模块启用jib-maven-plugin maven插件。

对于 NPM,你应该坚持使用 spotify docker-maven-plugin 或类似的东西。或者试试fabric8

于 2021-02-23T10:26:16.703 回答
0

如果有人仍在展望未来,请提供替代方案(这是我的谷歌搜索的第一次命中):

您可以将 jib 插件设置为使用打包的 .jar 文件,如果您使用它会自动生成,mvn package如果不存在代码则非常小(~2kb)

还要确保您的项目没有父项或依赖项,否则 jib 会将库复制到映像中。

<build>
    <plugins>
        <plugin>
            <groupId>com.github.eirslett</groupId>
            <artifactId>frontend-maven-plugin</artifactId>
            <version>1.12.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>install-node-and-npm</goal>
                    </goals>
                </execution>
                <execution>
                    <goals>
                        <goal>npm</goal>
                    </goals>
                </execution>
                <execution>
                    <goals>
                        <goal>npm</goal>
                    </goals>
                    <configuration>
                        <arguments>run build</arguments>
                    </configuration>
                </execution>
            </executions>
            <configuration>
                <nodeVersion>v16.9.1</nodeVersion>
            </configuration>
        </plugin>

        <plugin>
            <groupId>com.google.cloud.tools</groupId>
            <artifactId>jib-maven-plugin</artifactId>
            <version>2.7.1</version>
            <configuration>
                <containerizingMode>packaged</containerizingMode>
                <extraDirectories>
                    <paths>
                        <path>
                            <from>build</from>
                            <into>/var/www/html</into>
                        </path>
                    </paths>
                </extraDirectories>
                <container>
                    <entrypoint>INHERIT</entrypoint>
                </container>
                <from>
                    <image>nginx</image>
                </from>
                <to>
                    <image>THE IMAGE NAME:${project.version}</image>
                </to>
            </configuration>
        </plugin>
    </plugins>
</build>

创建它:mvn clean package jib:dockerBuild

使用潜水检查是否添加了不必要的文件

于 2021-10-30T13:49:15.130 回答