jib - Google Jib - 是否可以使用 CMD/ENTRYPOINT 在容器启动时运行 linux 命令?

标签 jib maven-jib

是否可以在容器使用 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 脚本的一些想法:

Another option is to define your own <entrypoint> to use a shell. (Therefore, you need a base image that includes a shell binary (such as /bin/bash). Note that the default base image prior to Jib 3.0 was Distroless and did not include a shell program. OTOH, Jib 3.0+ doesn't use Distroless.) In this method, you'll need to know the right Java runtime classpath and the main class to use in your JVM launch command. To help this, starting with Jib >= 3.1, Jib creates two JVM argument files inside a built image; they will hold, respectively, the classpath and the main class inside a built image.

Knowing the entrypoint, you can write a shell script (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 )

Alternatively, if you are on Java 9+, you can leverage the @-argument file:

exec java $JAVA_OPTS -cp @/app/jib-classpath-file @/app/jib-main-class-file

Place my-entrypoint.sh under <project root>/src/main/jib. This is the default directory for Jib's <extraDirectories> feature, and Jib will place src/main/jib/my-entrypoint.sh at the root directory in the container image. Then set the default <entrypoint> to this script:

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

Alternatively, if you invoke /bin/sh as below, you don't have to configure <extraDirectories> to make the file executable. This may not look customary; you would normally make the script executable and run it directly. But this is perfectly valid, and there is no difference in terms of actual execution (as long as the shebang of /entrypoint.sh is the same #!/bin/sh).

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

It's also possible to do this without creating a script (basically embedding the entire script in pom.xml and passing it to a shell program). In this case, you don't need to configure <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>

关于jib - Google Jib - 是否可以使用 CMD/ENTRYPOINT 在容器启动时运行 linux 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69254438/

相关文章:

jib - 使用 JIB 构建 Spring Boot fat JAR

docker - 将 JHipster 6.0.1 推送到 Gitlab 存储库

spring-boot - Dockerizing Spring Boot应用程序时发生ClassNotFoundException

spring-boot - spring-boot :build-image vs jib? 有什么区别

java - 离线使用 jib maven 插件构建 docker 容器的问题

spring-boot - 使用JIB插件对Spring Boot应用程序进行Docker化

docker - 如何使用Maven三角帆插件创建Muttilayer图像

jib - Google jib - 更改所有文件和文件夹的所有者