首页 > 解决方案 > 如何确保可以终止 Docker 入口点启动的进程?

问题描述

我正在构建一个启动长时间运行的 Java 进程的 Docker 映像。我想确保它可以与容器一起被杀死(例如,通过使用 Ctrl+C)但仍然执行清理。

如果我exec java -jar在我的入口点中使用,它会按预期工作。如果我只是在执行java -jar,则无法终止该进程。

但是exec,即使成功也使容器退出,如果此命令不是入口点中的最后一个命令,那将是一个问题。例如,如果随后进行了一些文件转换或清理,它将不会被执行:

exec java -jar "./lib/Saxon-HE-${SAXON_VER}.jar" -s:"$json_xml" -xsl:"$STYLESHEET" base-uri="$base"
rm "$json_xml"

我认为解释是使用exec该进程(java在这种情况下)变为 PID=1 并接收终止信号,而没有exec它会获得其他一些 PID 并且不接收信号,因此无法被终止。

所以我的问题有两个:

标签: linuxbashshelldockerentry-point

解决方案


您可以构建另一个程序来管理 java 子进程和清理,例如使用相同的javagorust编写这样的程序。我确信这些语言有适当的进程控制工具,你可以捕获 CTRL-C 和其他事件来停止内部子进程并进行清理。与搜索无论如何都会具有有限行为的工具相比,它可能甚至会花费更少的时间。此外,为此类问题开源它甚至可能是值得的。


推荐阅读