gpt4 book ai didi

linux - 如何确保可以终止由 Docker 入口点启动的进程?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:53 25 4
gpt4 key购买 nike

我正在构建一个启动长时间运行的 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,但没有收到信号,因此无法被杀死。

所以我的问题有两个方面:

  • 是否有一种解决方法可以像 exec 那样在成功时不退出容器就终止进程?
  • 如何确保在 exec(在本例中为 rm)之后执行清理,即使进程被终止/退出也是如此?

最佳答案

您可以创建一个入口点 bash 脚本来捕获 CTRL-C 信号,杀死(或优雅地停止?)java 进程并在之后进行清理。

示例(未测试):

#!/bin/bash

# trap ctrl-c and call ctrl_c()
trap ctrl_c INT

function ctrl_c() {
echo "Trapped CTRL-C"
# Do something here. Kill Java?
}

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

将它添加到您的 docker 镜像并使其成为您的入口点

FROM java:8

ADD docker-entrypoint.sh /docker-entrypoint.sh

ENTRYPOINT ["/docker-entrypoint.sh"]

关于linux - 如何确保可以终止由 Docker 入口点启动的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55647923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com