是否可以在容器使用 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 placesrc/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/