gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:47:30 30 4
gpt4 key购买 nike

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

最佳答案

(在我开始之前:即使在编译时运行 Maven 构建时扩展了 $JAVA_OPTS(显然它没有扩展),<jvmFlag>$JAVA_OPTS<jvmFlag> 仍然会失败,因为 $JAVA_OPTS 的整个字符串值包含多个 JVM 标志将作为单个参数传递给 java 二进制文件。例如,-Xms1024m -Xmx2048m 应该作为两个单独的标志传递。包括空格作为单个参数的整个字符串不是有效的 JVM 标志。)
如果可能,让基本图像定义 JAVA_TOOL_OPTIONS (注意不是 JAVA_TOOL_OPTS 也不是 JAVA_OPTS )。大多数 JVM 会尊重 JAVA_TOOL_OPTIONS .见 https://stackoverflow.com/a/58715040/1701388详情。 (另请注意,容器运行时( docker 、Kubernetes 等)始终可以在运行时提供环境变量(和/或覆盖在构建时定义为容器配置的任何变量)。也就是说,您可以 dynamically set arguments at runtime 。)
另一种选择是定义您自己的 <entrypoint>使用 shell 。 (因此,您需要一个包含 shell 二进制文件的基本镜像(例如 /bin/bash 。请注意,Jib 3.0 之前的默认基本镜像是 Distroless 并且不包含 shell 程序。OTOH,Jib 3.0+ doesn't use Distroless 。)在此方法中,您需要知道要在 JVM 启动命令中使用的正确 Java 运行时类路径和主类。为了解决这个问题,从 Jib >= 3.1 开始,Jib 创建了 two JVM argument files在构建的图像中;它们将分别保存构建镜像中的类路径和主类。
知道入口点,你可以写一个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>使文件可执行。这可能看起来不习惯;您通常会使脚本可执行并直接运行它。但这是完全有效的,在实际执行方面没有区别(只要 /entrypoint.sh 的 shebang 是相同的 #!/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>

关于maven - Jib - 如何使用基础镜像中的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59357410/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com