Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Docker entrypoint.sh用于自更新程序_Java_Shell_Docker_Signals_Docker Entrypoint - Fatal编程技术网

Java Docker entrypoint.sh用于自更新程序

Java Docker entrypoint.sh用于自更新程序,java,shell,docker,signals,docker-entrypoint,Java,Shell,Docker,Signals,Docker Entrypoint,我想在docker容器中运行(java)应用程序。此应用程序具有更新功能。这在启动时自动运行,可以从(web)GUI手动触发。更新下载新文件,然后运行新的可执行文件(使用新PID)并退出自身 通常,我在entrypoint.sh中使用execjava-jarmyprogram.jar“$@”。这将在更新发生时停止容器(因为PID=1退出) 仅使用不带exec的行不能正确转发SIGTERM/SIGKILL的docker stop。正如所解释的,转发这些信号是可能的,但我不知道在发生更新和产生新进程

我想在docker容器中运行(java)应用程序。此应用程序具有更新功能。这在启动时自动运行,可以从(web)GUI手动触发。更新下载新文件,然后运行新的可执行文件(使用新PID)并退出自身

通常,我在
entrypoint.sh
中使用
execjava-jarmyprogram.jar“$@”
。这将在更新发生时停止容器(因为PID=1退出)

仅使用不带
exec
的行不能正确转发
SIGTERM
/
SIGKILL
docker stop
。正如所解释的,转发这些信号是可能的,但我不知道在发生更新和产生新进程时如何跟踪PID

更新:因为我不是应用程序的开发人员,所以我正在寻找一种不修改应用程序的解决方案


更新2:我发现应用程序创建了一个
MyProgram.pid
文件,我可以通过
trap
读取该文件以杀死它,如上面链接的
program.sh
中所述。

通常我们将罐子烘焙到图像中。如果我们在运行时更新容器中的JAR,当我们停止容器时,我们将丢失这些更改。正常的升级实践是使用新的JAR更新应用程序规范,并使用某种管道将其重建为图像,然后用新的容器替换您的容器。

谢谢!虽然在您自己开发应用程序时建议使用您的方法,但我既无法访问源代码,也无法访问构建过程。不幸的是,这不会改变docker的“物理特性”。实际上,您无法执行您建议的操作,因为当容器停止时,无论您是否拥有源代码,更改都将丢失。你必须找到另一种方法来进行更新。这不是建议,这是使用docker的一个硬要求。首先,当容器停止(没有被删除)时,所有文件都保留在可写层中,并且不会丢失。第二,我希望避免停止容器,但保持更新的进程运行。拥有这个容器有什么意义?您正在使用容器作为老式服务器。除了增加复杂性和增加攻击面的缺点外,集装箱化并没有带来任何好处。你为什么要那样做?这毫无意义。只需运行容器,进行升级,复制新文件并使用它们构建一个新映像,就像使用当前容器一样(我假设,假设你说你没有源代码,至少你自己构建了容器,否则这就没有意义了)。我将容器用作一个轻量级虚拟机。这样,我可以保护主机不受应用程序的影响。我还可以为每个应用程序使用单独的容器,这样它们就不会干扰。