Jib-如何使用基础图像中的环境变量

时间:2019-12-16 13:15:44

标签: maven jib

我有一个基本的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>

2 个答案:

答案 0 :(得分:1)

(在我开始之前:即使在运行Maven构建时将$JAVA_OPTS扩展了(显然没有扩展),<jvmFlag>$JAVA_OPTS<jvmFlag>仍然会失败,因为整个{{1包含多个JVM标志的}}将作为单个参数传递给$JAVA_OPTS二进制文件,例如,java应作为两个单独的标志传递。整个字符串包括空格作为单个参数不是有效的JVM标志。)

如果可能,请让基本图像定义-Xms1024m -Xmx2048m(注意不要JAVA_TOOL_OPTIONSJAVA_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 配置文件中)。

请注意,这个环境变量根本不需要在基础镜像中定义。