在Dockerfile的入口点上运行java程序和shell脚本

在Dockerfile的入口点上运行java程序和shell脚本,docker,shell,dockerfile,Docker,Shell,Dockerfile,我有一个基本的docker图像,其中有一个Dockerfile,它有一个如下的条目 CMD ["/bootstrap.sh"] 在我引用这个父docker映像的子docker映像中,我有一个单独的入口点,它以java程序的形式启动容器,如下所示 ENTRYPOINT exec java -Duser.timezone=GMT -Djava.security.egd=file:/dev/./urandom $JAVA_OPTS -jar /app.jar 当我构建这个doc

我有一个基本的docker图像,其中有一个Dockerfile,它有一个如下的条目

CMD ["/bootstrap.sh"]
在我引用这个父docker映像的子docker映像中,我有一个单独的入口点,它以java程序的形式启动容器,如下所示

ENTRYPOINT exec java -Duser.timezone=GMT -Djava.security.egd=file:/dev/./urandom $JAVA_OPTS -jar /app.jar
当我构建这个docker子映像并尝试运行它时,只会出现java程序。引导,sh没有建立

在浏览了一些博客和stackoverflow文章之后,我想在子映像中知道,父映像中的CMD上下文丢失并被子映像入口点覆盖。然而,我想在entrypoint上运行shell脚本和java程序。在我的shell脚本中,我有一些需要它运行的可执行文件引用,它们将在后台继续运行shell程序,我的Java代码将调用这些shell程序并基于这些shell程序进行处理

我也尝试将这两个步骤合并到一个入口点中,如下所示,但这只是启动一个进程——shell脚本或Java程序,具体取决于dockerfile中首先指定的是哪个

ENTRYPOINT /bootstrap.sh && exec java -Duser.timezone=GMT -Djava.security.egd=file:/dev/./urandom $JAVA_OPTS -jar /app.jar
如何在Dockerfile中指定,以便它可以在容器启动时执行这两个进程。bootstrap.sh也可以在后台运行


请帮我解决这个问题。

对于那些苦苦挣扎的人,我总算解决了这个问题。我不知道这是否是一个完美的解决方案,但它对我有效

我所做的是创建了另一个shell脚本文件,然后从这里调用bootstrap.sh,后面是Java程序

脚本文件如下所示:

#!/bin/bash

echo "[server-startup] Executing bootstrap script"
/bootstrap.sh &

echo "[server-startup] Starting java application"
exec java -Duser.timezone=GMT -Djava.security.egd=file:/dev/./urandom $JAVA_OPTS -jar /app.jar
我的Dockerfile条目被修改如下,它称为上面创建的这个新shell脚本文件

ENTRYPOINT ["/server-start.sh"]

希望这能帮助寻找答案的人。

通常,如果需要两个流程,最好将它们作为两个单独的容器启动。我建议将JVM调用更改为
CMD java…
,这将使使用备用命令
docker run运行第二个容器变得容易。。。image/bootstrap.sh
。这个docker最终可以在docker compose和kubernetes中运行。docker run将手动启动容器。那么在docker compose和Kubernetes中,我可以提供/bootstrap.sh来启动哪些功能呢?完全同意@DavidMaze:一方面,你的
java
程序,你的
bootstrap.sh启动的服务应该在两个不同的容器中。顺便说一句,请注意,
ENTRYPOINT
命令应始终采用exec格式(即带有
[“…”,“…”]
),否则将忽略
CMD
规范(即使在
ENTRYPOINT
之后指定
CMD
)。有关详细信息,请参阅另一个SO线程。您是否找到了在一个命令中同时运行java和shell脚本的方法