sbt docker:发布 - 应用程序崩溃,但容器没有

时间:2018-02-09 14:33:30

标签: scala docker sbt-native-packager

我使用sbt-native-packager插件为我的Scala应用程序构建docker镜像。我注意到当容器内的进程崩溃时(log显示Exception in thread "main"...并且进程肯定已经死了),容器仍然是#34; 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脚本,它收集所有必要的参数(类路径,主类名等)并使用java命令运行应用程序。所以我的猜测是关于这个设置的一些东西使得docker认为容器是"运行"只要JVM正在运行,无论我的代码崩溃......

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

2 个答案:

答案 0 :(得分:0)

运行裸机舱时,会出现此行为,因为如果节点发生故障,裸机舱不会重新安排。

部署pod时,是否将restartPolicy设置为“Always”,“OnFailure”或“Never”?

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

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

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

答案 1 :(得分:0)

经过一些实验后,看起来某处的线程泄漏会阻止应用程序退出。我怀疑它可能来自akka ActorSystem,但还没有找到它。 无论哪种方式,在主线程上捕获异常并调用System.exit(1)会导致java进程死亡并且容器停止。