斯卡拉项目dockerisation - 在SBT问题

问题描述 投票:1回答:1

我是新手到斯卡拉的世界里,我尝试运行该项目,了解Scala的休息播放工作流程:https://developer.lightbend.com/guides/play-rest-api/index.html

我能够运行这个项目成功地使用sbt run命令

/scala/play-scala-rest-api-example$ sbt run 
[info] Loading settings for project play-scala-rest-api-example-build from plugins.sbt ...
[info] Loading project definition from /home/scala/play-scala-rest-api-example/project
[info] Loading settings for project root from build.sbt ...
[info] Loading settings for project docs from build.sbt ...
[info] Set current project to play-scala-rest-api-example (in build file:/home/dominic/scala/play-scala-rest-api-example/)

--- (Running the application, auto-reloading is enabled) ---

[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Enter to stop and go back to the console...)

我尝试把这个项目中泊坞窗

FROM ubuntu:latest
MAINTAINER group
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y  software-properties-common && \
    add-apt-repository ppa:webupd8team/java -y && \
    apt-get update && \
    echo oracle-java7-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections && \
    apt-get install -y oracle-java8-installer && \
    apt-get clean
RUN echo "deb https://dl.bintray.com/sbt/debian /" | tee -a /etc/apt/sources.list.d/sbt.list
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
RUN apt-get update
RUN apt-get install -y sbt=1.2.8
COPY ./ ./
WORKDIR ./play-scala-rest-api-example
CMD ["sbt","run"]

这是成功打造为码头工人形象

但是,当我运行这个码头工人的形象,它是打开的端口:9000(因为我们没有泊坞窗运行),并立即将端口关闭像下面

--- (Running the application, auto-reloading is enabled) ---

[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0.0.0.0:9000

(Server started, use Enter to stop and go back to the console...)

[info] p.c.s.AkkaHttpServer - Stopping server...

[success] Total time: 614 s, completed Feb 5, 2019 5:11:56 AM
[INFO] [02/05/2019 05:11:56.196] [Thread-2] [CoordinatedShutdown(akka://sbt-web)] Starting coordinated shutdown from JVM shutdown hook

我查询就是为什么它被关闭,当我在泊坞窗运行?如何永远跑的?

scala docker playframework sbt dockerfile
1个回答
2
投票

您没有-it选项(它允许你就像你在一个终端是连接到它的标准输入)上运行您的容器,但你的程序需要输入时开始(“按回车键......”)。你的程序可能等待在stdin输入和启动时可能读取EOF(文件结束),导致它终止,这反过来终止您的容器。

如果你想运行在后台的容器,在我看来,你有两个选择:

1)使用docker run -it -p 9000:9000 <your_other_options> <your_image>运行您的容器中,然后使用CTRL+P然后CTRL+Q把它的背景。你会看到你的容器仍在docker ps运行。重新装上它,你可以简单地使用docker attach <your_container>。当然,如果你想在单元测试服务器,你不会想这样做手工的CTRL+P/Q的事情,比如说,运行容器,这种做法将不适用。

2)修改您的服务器,以便它可以完全在后台运行,无需用户输入。在这种情况下,终止程序的方式将是向它发送一个SIGINT信号。这是CTRL+C通常不会,也什么docker stop <your_container>会为你做。你可能会想在你的Scala代码,妥善处理这个信号,这样就可以进行一些清理,而不是突然崩溃。这可以通过使用a shutdown hook完成。关闭挂钩来自JVM和不斯卡拉具体。你应该采取的手动回采你关闭挂钩的任何线程/子护理。

第二种方法是最好的IMO,但也更复杂,可能矫枉过正,如果第一种方法适合你。

© www.soinside.com 2019 - 2024. All rights reserved.