Docker 容器内的进程没有接收到信号?

Docker 容器内的进程没有接收到信号?

我在 Docker 容器中有一个进程,该进程应该在关闭时记录线程转储(在 stdout 上)。但是当docker stop调用它时,没有输出。

看起来要么是进程没有接收到 TERM 信号,要么是在关闭完成之前输出就被分离了。

我在 Dockerfile 中仅使用了CMD(否):ENTRYPOINT

CMD java ${MY_JAVA_OPTS} my-uberjar.jar

如何在关机时获得输出?

答案1

docker 容器的入口点是调用该 CMD 的 shell,因为它位于壳型

然而,这种呼叫方式不会传播信号。

您需要使用 调用该过程exec,这可以通过使用执行形式

CMD ["java", "-Doption=value", "my-uberjar.jar"]

或者明确使用exec

CMD exec java ${MY_JAVA_OPTS} my-uberjar.jar

这会导致 shell 用启动的进程替换自身,然后接收信号。

执行形式但是,不进行 shell 扩展(因为没有 shell),因此如果需要,您必须包装一个 shell 调用,然后exec再次:

CMD ["/bin/sh", "-c", "exec", "java", "${MY_JAVA_OPTS}", ...

或使用壳型exec上述相同。

相关内容