【问题标题】:Google Jib - Is it possible to run a linux command at container startup using CMD/ENTRYPOINT?Google Jib - 是否可以在容器启动时使用 CMD/ENTRYPOINT 运行 linux 命令?
【发布时间】:2021-11-14 03:54:02
【问题描述】:

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

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

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

【问题讨论】:

  • 您使用的是什么基础镜像?您是否尝试过使用自定义入口点?并将您的命令包含在脚本中?

标签: jib maven-jib


【解决方案1】:

您可以随时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,则不必 配置&lt;extraDirectories&gt; 使文件可执行。这可能 看起来不习惯;您通常会使脚本可执行并且 直接运行它。但这是完全有效的,并且没有 在实际执行方面的差异(只要 shebang 的 /entrypoint.sh#!/bin/sh 相同。

<container>
  <entrypoint>
    <arg>/bin/sh</arg>
    <arg>/my-entrypoint.sh</arg>
  </entrypoint>
</container>

也可以在不创建脚本的情况下执行此操作(基本上 将整个脚本嵌入pom.xml 并将其传递给 shell 程序)。在这种情况下,您不需要配置 &lt;extraDirectories&gt;.

          <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>

【讨论】:

    猜你喜欢
    • 2017-02-16
    • 1970-01-01
    • 2021-11-29
    • 2023-03-09
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多