当前位置: 首页 > 知识库问答 >
问题:

如何调用从docker外壳脚本(entrypoint)Spring启动java应用程序?

贝杜吟
2023-03-14

我有一个Dockerfile,以以下内容结尾:

ENTRYPOINT[“java”,“org.springframework.boot.loader.JarLauncher”]

现在,我想运行一些初始化从外壳脚本在此之前。所以我必须重构:

ENTRYPOINT[/ENTRYPOINT.sh]

与:

!#/bin/bash
echo "some init"

#TODO
#ENTRYOINT["java", "org.springframework.boot.loader.JarLauncher"]

问:我如何才能真正模拟外壳脚本内的java entrypoint?

共有2个答案

仲霍英
2023-03-14

TL;DR:如果入口点包装器以行exec“$@”结尾,那么它将运行图像的CMD。如果将ENTRYPOINT更改为CMD,则无需在脚本中硬编码。

在现在的普通Dockerfile中,可以将ENTRYPOINT更改为CMD,而不影响容器的使用方式。

FROM openjdk:17
...
# not ENTRYPOINT
CMD ["java", "org.springframework.boot.loader.JarLauncher"]

就其本身而言,这为您提供了一些灵活性;例如,可以直接查看容器内部,或者启动交互式shell,而不是正常的容器过程。

docker run --rm my-image ls /app
docker run --rm -it my-image sh

现在,如果您有这样的CMD,您可以非常直接地向它添加一个ENTRYPOINT包装脚本。CMD作为附加参数传递给ENTRYPOINT,外壳调用exec "$@"将运行作为CMD传递的任何内容。

#!/bin/sh
# entrypoint.sh
echo "some init"
touch /init-has-happened
exec "$@"

重要的是,这与我上面展示的备用docker run命令一起工作。备用docker run命令替换了DockerfileCMD,但保留了ENTRYPOINT包装器,因此备用命令在末尾的exec "$@"行中运行。

docker run --rm my-image ls -l /init-has-happened
# the file will exist because the entrypoint wrapper creates it
鲁浩渺
2023-03-14

ShellScript可以编辑为运行普通Java文件。

从docker留档:

如果您需要为单个可执行文件编写启动器脚本,您可以通过使用exec确保最终可执行文件接收Unix信号

!#/bin/bash
echo "some init"

#Execute using linux 'exec' Java launcher
exec java org.springframework.boot.loader.JarLauncher
 类似资料:
  • 这是我在我的 问:是否有可能在此之前简单地执行另一个脚本,而不必编写额外的脚本? 伪代码: 而不是:

  • 我编写了shell脚本文件,并将其与docker ENTRYPOINT一起使用,但当我运行docker image时,由于ENTRYPOINT代码行的原因,它停止了,没有任何错误日志 我的Dockerfile docker入口点。嘘 我的docker run命令 有什么问题??

  • 问题内容: 我想运行在命令行(Linux和Mac)上创建的Java程序。我不想一直输入“ java”和参数,因此我正在考虑创建包装器脚本。使它们无处不在的最佳方法是什么?我也希望能够传递参数。我当时正在考虑使用“ shift”执行此操作(删除第一个参数)。 有没有一种更好的方法可以完全不使用脚本呢?也许制作一个不需要通过“ java”命令调用的可执行文件? 问题答案: 假设您使用的是与Bourne

  • 问题内容: 我有一个程序和一个脚本,希望将其合并到我的Web应用程序中。 我想使用它们来解析上传到我的网站的文件;处理过程可能需要几秒钟,因此我也避免阻止该应用程序。 我如何才能只接受文件,然后仅在控制器的子过程中运行程序和脚本? 问题答案: 参见child_process。这是一个使用的示例,它允许您在输出数据时写入stdin并从stderr / stdout中读取。如果您不需要写stdin并且

  • 问题内容: 完成Jenkins任务后,我将使用Jenkins的后置条件配置部分执行Linux shell脚本。 该Linux Shell脚本希望在后端启动备用服务,并且不会导致Jenkins暂停。 我尝试使用“ nohup +&”等,但是它不起作用。 有一个好的方法吗? 问题答案: 詹金斯可能正在等待管道关闭。您的后台进程继承了一些文件描述符,并一直保持打开状态。 如果幸运的话,唯一的文件描述符是

  • 我有一个简单的电子应用程序,我想在多个平台上运行。我从git挂钩启动应用程序。我有多个特定于平台的应用程序包发布到npm。windows路径运行良好。下面是我的windows commit msg钩子脚本(它运行我的electron apps.exe,效果很好): 我在mac上安装了这个git钩子脚本(它不起作用)。 当mac钩子运行时,它会出现以下错误: 看起来我可能试图在mac上错误地启动这个