1

每当容器使用 cmd 或入口点或 jib maven 插件中的任何其他机制从 jib 映像启动时,是否可以运行 linux 命令,然后启动 java 进程?

在我的情况下,我想运行这个命令:

echo "127.0.0.1 $HOSTNAME" >> /etc/hosts
4

1 回答 1

2

您始终可以使用<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>
于 2021-09-20T18:24:36.077 回答