我有一个基本的Java映像,其中有一些预定义的java_opts作为环境变量。如何在插件中使用它们?
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>1.8.0</version>
<configuration>
<from>
<image>${docker.registry}java:11</image>
</from>
<to>
<image>${docker.registry}portal-backend:${dockerfile.tag}</image>
</to>
<container>
<jvmFlags>
# This will fail
<jvmFlag>$JAVA_OPTS</jvmFlag>
</jvmFlags>
</container>
</configuration>
</plugin>
答案 0 :(得分:1)
(在我开始之前:即使在运行Maven构建时将$JAVA_OPTS
扩展了(显然没有扩展),<jvmFlag>$JAVA_OPTS<jvmFlag>
仍然会失败,因为整个{{1包含多个JVM标志的}}将作为单个参数传递给$JAVA_OPTS
二进制文件,例如,java
应作为两个单独的标志传递。整个字符串包括空格作为单个参数不是有效的JVM标志。)
如果可能,请让基本图像定义-Xms1024m -Xmx2048m
(注意不要JAVA_TOOL_OPTIONS
或JAVA_TOOL_OPTS
)。大多数JVM都会尊重JAVA_OPTS
。有关详细信息,请参见https://stackoverflow.com/a/58715040/1701388。
另一种选择(我并不推荐这样做)是定义自己的JAVA_TOOL_OPTIONS
。但是,这需要知道Jib如何设置默认容器入口点(这是Jib内部的详细信息,将来可能会更改),因为您需要传递正确的类路径和主类。这种方法还要求您使用包含外壳二进制文件的基本映像(例如<entrypoint>
); Jib使用的默认基本映像(Distroless)不包含Shell程序。运行Jib时,Jib会打印出此默认入口点。
/bin/bash
知道入口点之后,您可以编写一个shell脚本([INFO] Container entrypoint set to [java, -cp, /app/resources:/app/classes:/app/libs/*, example.HelloJarWorld]
):
my-entrypoint.sh
将#!/bin/sh
# Assumes `java` is on PATH in the base image.
exec java $JAVA_OPTS \
-cp /app/resources:/app/classes:/app/libs/* \
example.HelloJarWorld
放在my-entrypoint.sh
下。这是Jib的<project root>/src/main/jib
功能的默认目录,并且Jib将<extraDirectories>
放在容器映像的根目录中。然后,为此脚本设置默认的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>
也可以在不创建脚本的情况下执行此操作(基本上将整个脚本嵌入<container>
<entrypoint>
<arg>/bin/sh</arg>
<arg>/my-entrypoint.sh</arg>
</entrypoint>
</container>
中并将其传递给Shell程序)。在这种情况下,您无需配置pom.xml
。
<extraDirectories>
答案 1 :(得分:0)
我的解决方案是完全从 jib-maven-plugin 配置中删除 JVM 内存参数。相反,我为容器定义了 JAVA_TOOL_OPTIONS
环境变量(例如:JAVA_TOOL_OPTIONS='-Xss=512k'
)(例如:在 docker-compose 配置文件中)。
请注意,这个环境变量根本不需要在基础镜像中定义。