对 maven 但非 Java 应用程序使用 jib
Using a jib for maven but non-Java application
我正在创建项目并使用 Jib 创建容器并将它们推送到 ECR。这是一个多模块 Maven 项目,有 3 个子模块,其中 2 个是标准的 java spring-boot 项目,可以与 Jib 一起正常工作,另一个是 npm 项目,使用MVN。这是它的 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]
应用的项目结构
非常感谢对此的帮助。
JIB 仅适用于 java 个项目。它处理在优化层中安装 Java 运行时和依赖项。但它无法创建 NPM docker 个图像。
所以你只能为java个模块启用jib-maven-plugin maven插件。
对于 NPM,您应该坚持使用 spotify docker-maven-plugin 或类似的东西。
或者 fabric8 试试看。
Jib Maven 和 Gradle 插件适用于 Java 应用程序,错误消息抱怨 NPM 模块中没有已编译的 .class
文件。但是,从技术上讲,您可以使用一些技巧让 Jib 构建 NPM 映像(例如,在 src/main/java
下放置一个虚拟 DummyClass.java
以绕过错误,覆盖 <container><entrypoint>
以不执行java
,使用<extraDirectories>
to put arbitrary files, set <from><image>
to use a non-JRE base image, etc.). You may also need to remove files using the Jib Layer-Filter extension。但是,由于 Jib 确实是为 Java 个应用量身定制的,所以我不能真正推荐它。
仅供参考,Jib 可以通过 Jib Extension Framework 进行高度自定义和扩展,因此理论上您可以编写一个 NPM Jib 扩展来涵盖这个高度专业化的工作流程(并与 Jib 社区共享)。
对于非 Java 应用程序和非 Maven 工作流,我们还有其他 Jib 解决方案:Jib Core (the Java library) and Jib CLI. Jib CLI may work in this case, although it's a not a Maven plugin. (I don't know if it's a good idea, but FYI, there seems a few ways to run an arbitrary command in Maven。)
相关,此 article 显示了一个示例,该示例使用 Jib Layer-Filter 扩展来启用 Jib 不支持的用例。
如果有人仍在期待,请提供替代方案(这是我的 google 搜索的第一个命中):
您可以将 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
使用dive检查是否添加了不必要的文件
我正在创建项目并使用 Jib 创建容器并将它们推送到 ECR。这是一个多模块 Maven 项目,有 3 个子模块,其中 2 个是标准的 java spring-boot 项目,可以与 Jib 一起正常工作,另一个是 npm 项目,使用MVN。这是它的 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]
应用的项目结构
非常感谢对此的帮助。
JIB 仅适用于 java 个项目。它处理在优化层中安装 Java 运行时和依赖项。但它无法创建 NPM docker 个图像。
所以你只能为java个模块启用jib-maven-plugin maven插件。
对于 NPM,您应该坚持使用 spotify docker-maven-plugin 或类似的东西。 或者 fabric8 试试看。
Jib Maven 和 Gradle 插件适用于 Java 应用程序,错误消息抱怨 NPM 模块中没有已编译的 .class
文件。但是,从技术上讲,您可以使用一些技巧让 Jib 构建 NPM 映像(例如,在 src/main/java
下放置一个虚拟 DummyClass.java
以绕过错误,覆盖 <container><entrypoint>
以不执行java
,使用<extraDirectories>
to put arbitrary files, set <from><image>
to use a non-JRE base image, etc.). You may also need to remove files using the Jib Layer-Filter extension。但是,由于 Jib 确实是为 Java 个应用量身定制的,所以我不能真正推荐它。
仅供参考,Jib 可以通过 Jib Extension Framework 进行高度自定义和扩展,因此理论上您可以编写一个 NPM Jib 扩展来涵盖这个高度专业化的工作流程(并与 Jib 社区共享)。
对于非 Java 应用程序和非 Maven 工作流,我们还有其他 Jib 解决方案:Jib Core (the Java library) and Jib CLI. Jib CLI may work in this case, although it's a not a Maven plugin. (I don't know if it's a good idea, but FYI, there seems a few ways to run an arbitrary command in Maven。)
相关,此 article 显示了一个示例,该示例使用 Jib Layer-Filter 扩展来启用 Jib 不支持的用例。
如果有人仍在期待,请提供替代方案(这是我的 google 搜索的第一个命中):
您可以将 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
使用dive检查是否添加了不必要的文件