问题描述
我正在创建一个项目并使用 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 是我们之前采用的一种方式,现在我们正在转向 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]
应用的项目结构
非常感谢这方面的帮助。
解决方法
Jib Maven 和 Gradle 插件适用于 Java 应用程序,错误消息抱怨您的 NPM 模块中没有已编译的 .class
文件。但是,从技术上讲,您可以通过一些技巧让 Jib 构建 NPM 映像(例如,在 DummyClass.java
下放置一个虚拟 src/main/java
以绕过错误,覆盖 <container><entrypoint>
以不执行java
,使用 <extraDirectories>
放置任意文件,设置 <from><image>
使用非 JRE 基础映像等)。您可能还需要使用 Jib Layer-Filter extension 删除文件。但是,由于 Jib 确实是为 Java 应用量身定制的,因此我无法真正推荐它。
仅供参考,Jib 可通过 Jib Extension Framework 进行高度自定义和扩展,因此理论上您可以编写 NPM Jib 扩展来涵盖这一高度专业化的工作流程(并与 Jib 社区共享)。
对于非 Java 应用程序和非 Maven 工作流,我们还有其他 Jib 解决方案:Jib Core(Java 库)和 Jib CLI。 Jib CLI 可能在这种情况下工作,尽管它不是 Maven 插件。 (我不知道这是否是个好主意,但仅供参考,似乎有几种方法可以run an arbitrary command in Maven。)
相关,此 article 显示了一个示例,该示例使用 Jib 层过滤器扩展来启用 Jib 不支持的用例。
,JIB 仅适用于 java 项目。它处理在优化层中安装 Java 运行时和依赖项。但它不能创建 NPM docker 镜像。
所以你只能为java模块启用jib-maven-plugin maven插件。
对于 NPM,你应该坚持使用 spotify docker-maven-plugin 或类似的东西。 或者试试fabric8。