Search code examples
scaladockerakka-streamakka-http

Akka HTTP shuts down prematurely in a docker container


I have a simple Akka HTTP server running locally on port 8080. It works perfectly and displays the following message:

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

I am using sbt-assembly to create the .jar file. It lives under target/scala-2.12/my-app-assembly-0.1.jar

Then, I create a simple Dockerfile like:

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"]

Build the docker image:

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

And run it:

docker run {my namespace}/my-app

Now, it also displays:

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

But immediately after that, it throws these errors and shutdowns:

...
[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

Any ideas why is this happening?


Solution

  • By default Docker closes standard input which may impact your app due to it's prompt about user input: press enter to kill server.

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

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

    Normally daemon or server processes shouldn't require this.