sbt docker:Publish - 应用程序崩溃但容器没有

sbt docker:Publish - app crashes but container doesn't

我正在使用 sbt-native-packager 插件为我的 Scala 应用程序构建 docker 图像。我注意到当容器内的进程崩溃时(日志显示 Exception in thread "main"... 并且进程肯定已经死了),容器仍然是 "alive":

me@my-laptop$ docker exec 5cca ps
PID TTY          TIME CMD
  1 ?        00:00:08 java
152 ?        00:00:00 ps

生成的Dockerfile为:

FROM java:openjdk-8-jre
WORKDIR /opt/docker
ADD opt /opt
RUN ["chown", "-R", "daemon:daemon", "."]
USER daemon
ENTRYPOINT ["bin/the-app-name"]
CMD []

其中 bin/the-app-name 是一个相当大的自动生成的 bash 脚本,它收集了所有必要的参数(class路径、主要 class 名称等)和使用 java 命令运行应用程序。所以我的猜测是,只要 JVM 是 运行,关于这个设置的某些东西使得 docker 认为容器是 "running",不管我的代码崩溃...

知道如何在应用程序崩溃时让我的容器退出吗?

当 运行ning naked pods 这种行为是预期的,因为 naked pods 在节点故障的情况下不会重新安排。

部署pod时,restartPolicy是设置为"Always"、"OnFailure"还是"Never"?

pod 的当前状态现在可能是 "Ok",但这并不一定意味着 pod 之前没有重新启动过。 你能 运行 kubectl get po 并打印输出来检查 pod 是否重启了吗?

关于 naked pods 的信息:https://kubernetes.io/docs/concepts/configuration/overview/#naked-pods-vs-replication-controllers-and-jobs

有关重启策略的更多信息:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle

经过一些试验,似乎有一个 thread-leak 某处阻止应用程序退出。我怀疑它可能来自 akka ActorSystem 但还没有找到它。 无论哪种方式,在主线程上捕获异常并调用 System.exit(1) 都会导致 java 进程终止并且容器停止。