【发布时间】: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