(在我开始之前:即使$JAVA_OPTS
在编译时运行 Maven 构建时扩展(显然它没有扩展),<jvmFlag>$JAVA_OPTS<jvmFlag>
仍然会失败,因为$JAVA_OPTS
包含多个 JVM 标志的整个字符串值将作为单个参数传递给java
二进制。例如,-Xms1024m -Xmx2048m
应该作为两个单独的标志传递。包括空格作为单个参数的整个字符串不是有效的 JVM 标志。)
如果可能,请定义基本图像JAVA_TOOL_OPTIONS
(注意 not JAVA_TOOL_OPTS
nor JAVA_OPTS
)。大多数 JVM 都会尊重JAVA_TOOL_OPTIONS
. 有关详细信息,请参阅https://stackoverflow.com/a/58715040/1701388。(另请注意,容器运行时(docker
、Kubernetes 等)始终可以在运行时提供环境变量(和/或覆盖在构建时定义为容器配置的任何变量)。也就是说,您可以在运行时动态设置参数。)
另一种选择是定义自己<entrypoint>
的使用外壳。(因此,您需要一个包含 shell 二进制文件(例如/bin/bash
)的基本映像。请注意,Jib 3.0 之前的默认基本映像是Distroless并且不包含 shell 程序。OTOH,Jib 3.0+ 不使用 Distroless。)
在这种方法中,您需要知道正确的 Java 运行时类路径和要在 JVM 启动命令中使用的主类。为了解决这个问题,从 Jib >= 3.1 开始,Jib在构建的映像中创建了两个 JVM 参数文件;它们将分别保存构建图像中的类路径和主类。
知道入口点后,您可以编写一个 shell 脚本 ( my-entrypoint.sh
):
#!/bin/sh
# Assumes `java` is on PATH in the base image.
exec java $JAVA_OPTS \
-cp $( cat /app/jib-classpath-file ) \
$( cat /app/jib-main-class-file )
或者,如果您使用的是 Java 9+,则可以利用 @-argument 文件:
exec java $JAVA_OPTS -cp @/app/jib-classpath-file @/app/jib-main-class-file
置于. my-entrypoint.sh
_ <project root>/src/main/jib
这是 Jib<extraDirectories>
功能的默认目录,Jib 将放置src/main/jib/my-entrypoint.sh
在容器镜像的根目录中。<entrypoint>
然后将此脚本设置为默认值:
<container>
<!-- Assumes you have /bin/sh as specified at the top of /my-entrypoint.sh. -->
<entrypoint>/my-entrypoint.sh</entrypoint>
</container>
<!-- You also need to make the script executable. -->
<extraDirectories>
<permissions>
<permission>
<file>/my-entrypoint.sh</file>
<mode>755</mode>
</permission>
</permissions>
</extraDirectories>
或者,如果您/bin/sh
按如下方式调用,则无需配置<extraDirectories>
文件即可执行。这可能看起来不习惯;您通常会使脚本可执行并直接运行它。但这是完全有效的,在实际执行方面没有区别(只要 shebang/entrypoint.sh
的相同#!/bin/sh
)。
<container>
<entrypoint>
<arg>/bin/sh</arg>
<arg>/my-entrypoint.sh</arg>
</entrypoint>
</container>
也可以在不创建脚本的情况下执行此操作(基本上将整个脚本嵌入其中pom.xml
并将其传递给 shell 程序)。在这种情况下,您不需要配置<extraDirectories>
.
<container>
<entrypoint>
<arg>/bin/sh</arg>
<arg>-c</arg>
<arg>exec java $JAVA_OPTS -cp $( cat /app/jib-classpath-file ) $( cat /app/jib-main-class-file )</arg>
</entrypoint>
</container>