【发布时间】:2021-11-14 03:54:02
【问题描述】:
是否可以在容器使用 cmd 或入口点或 jib maven 插件中的任何其他机制从 jib 映像启动时运行 linux 命令,然后启动 java 进程?
在我的情况下,我想运行这个命令:
echo "127.0.0.1 $HOSTNAME" >> /etc/hosts
【问题讨论】:
-
您使用的是什么基础镜像?您是否尝试过使用自定义入口点?并将您的命令包含在脚本中?
是否可以在容器使用 cmd 或入口点或 jib maven 插件中的任何其他机制从 jib 映像启动时运行 linux 命令,然后启动 java 进程?
在我的情况下,我想运行这个命令:
echo "127.0.0.1 $HOSTNAME" >> /etc/hosts
【问题讨论】:
您可以随时set a custom entrypoint using <container><entrypoint>。您可以启动 shell 脚本、运行不同的程序等。有时,您可能希望使用 <extraDirectories> 功能来复制脚本(并为其赋予可执行权限)。
请参阅here 了解运行 shell 脚本的一些想法:
另一种选择是定义您自己的
<entrypoint>以使用shell。 (因此,您需要一个包含 shell 二进制文件的基础映像(例如 如/bin/bash)。请注意,Jib 3.0 之前的默认基础映像是 Distroless 和 不包括外壳程序。 OTOH,@ 987654324@。) 在此方法中,您需要知道正确的 Java 运行时类路径 以及在 JVM 启动命令中使用的主类。为了帮助这一点, 从 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>使文件可执行。这可能 看起来不习惯;您通常会使脚本可执行并且 直接运行它。但这是完全有效的,并且没有 在实际执行方面的差异(只要 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>
【讨论】: