我在 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
上述相同。