【问题标题】:Run java program and shell script on entrypoint in Dockerfile在 Dockerfile 的入口点上运行 java 程序和 shell 脚本
【发布时间】:2021-01-25 04:33:37
【问题描述】:

我有一个基础 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 程序出现。 bootstrap,sh 没有建立起来。

在浏览了一些博客和 stackoverflow 帖子后,我发现在子图像中,来自父图像的 CMD 上下文丢失并被子图像入口点覆盖。但是,我想在入口点上同时运行 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 也可以在后台运行。

请帮我解决这个问题。

【问题讨论】:

  • 通常如果您需要两个进程,最好将它们作为两个单独的容器启动。我建议将 JVM 调用更改为 CMD java ...,这样可以使用备用命令 docker run ... the-image /bootstrap.sh 轻松运行第二个容器。
  • 这个 docker 终于可以在 docker-compose 和 kubernetes 中运行了。 docker run 将手动启动容器。 docker-compose 和 Kubernetes 中的等价物是什么,然后我可以提供 /bootstrap.sh 来启动?
  • 完全同意@DavidMaze:一方面你的java 程序,你的bootstrap.sh 启动的服务应该在两个不同的容器中。顺便说一句,请注意ENTRYPOINT 命令应始终以执行形式(即使用["…", "…"]),否则CMD 规范将被忽略(即使您指定CMD 之后 ENTRYPOINT)。有关详细信息,请参阅其他 SO 线程 CMD doesn't run after ENTRYPOINT in Dockerfile
  • 你有没有找到一种方法在一个命令中同时运行 java 和 shell 脚本

标签: docker shell dockerfile


【解决方案1】:

对于那些正在苦苦挣扎的人,我能够以某种方式解决这个问题。我不知道这是否是完美的解决方案,但它对我有用。

我所做的是创建了另一个 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"]

希望这对正在寻找答案的人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2016-05-19
    相关资源
    最近更新 更多