Akka HTTP 在 docker 容器中过早关闭

Akka HTTP shuts down prematurely in a docker container

我有一个简单的 Akka HTTP 服务器 运行 在本地端口 8080 上运行。它运行良好并显示以下消息:

Started server at 127.0.0.1:8080, press enter to kill server

我正在使用 sbt-assembly 创建 .jar 文件。它住在 target/scala-2.12/my-app-assembly-0.1.jar

然后,我创建了一个简单的 Dockerfile,例如:

FROM openjdk:8u131
ADD target/scala-2.12/my-app-assembly-0.1.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
CMD ["-XX:+UnlockExperimentalVMOptions", "-XX:+UseCGroupMemoryLimitForHeap", "-XX:MaxRAMFraction=1", "-XshowSettings:vm"]

构建 docker 图像:

docker build -t {my namespace}/my-app .

和运行它:

docker run {my namespace}/my-app

现在,它还显示:

Started server at 127.0.0.1:8080, press enter to kill server

但紧接着,它抛出这些错误并关闭:

...
[DEBUG] [10/08/2017 23:18:15.056] [default-akka.actor.default-dispatcher-7] [akka://default/system/IO-TCP/selectors/$a/0] Monitored actor [Actor[akka://default/user/StreamSupervisor-0/$$a#1560882800]] terminated
[DEBUG] [10/08/2017 23:18:15.060] [default-akka.actor.default-dispatcher-6] [akka://default/system/IO-TCP/selectors/$a/0] Closing serverSocketChannel after being stopped
[DEBUG] [10/08/2017 23:18:15.067] [default-akka.actor.default-dispatcher-4] [EventStream] shutting down: StandardOutLogger started

知道为什么会这样吗?

默认情况下 Docker 关闭标准输入,这可能会影响您的应用,因为它会提示用户输入:press enter to kill server

Run the container with the -i option to keep stdin open.

docker run -i {my namespace}/my-app

通常守护进程或服务器进程不需要这个。