我有一个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?
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
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上错误地启动这个