每当容器使用 cmd 或入口点或 jib maven 插件中的任何其他机制从 jib 映像启动时,是否可以运行 linux 命令,然后启动 java 进程?
在我的情况下,我想运行这个命令:
echo "127.0.0.1 $HOSTNAME" >> /etc/hosts
您始终可以使用<container><entrypoint>
. 您可以启动 shell 脚本、运行不同的程序等。有时,您可能希望使用该<extraDirectories>
功能来复制脚本(并为其授予可执行权限)。
有关运行 shell 脚本的一些想法,请参见此处:
另一种选择是定义自己
<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>