代码之家  ›  专栏  ›  技术社区  ›  Nira

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

  •  0
  • Nira  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  0
  •   Shibboleet    6 年前

    运行裸吊舱时,会出现这种行为,因为裸吊舱不会在节点发生故障时重新调度。

    部署pod时,是否将restartPolicy设置为“始终”、“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

        2
  •  0
  •   Nira    6 年前

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