我是Scala世界的新手,我尝试运行此项目以了解Scala Rest Play工作流程: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...)
我尝试将此项目放入docker
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"]
已成功构建为docker映像
但是当我运行该docker映像时,它正在打开端口9000(因为我们没有docker运行),并且该端口立即关闭,如下所示
--- (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
我的查询是为什么在docker中运行时它会关闭?如何永远运行?
答案 0 :(得分:2)
您正在运行没有-it
选项的容器(该选项使您可以像在终端机中一样连接到其标准输入),但是程序在启动时需要输入(“按Enter ... ”)。您的程序可能正在等待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,并且不是特定于Scala的。您应该注意手动停止关机钩子中的任何线程/子进程。
第二种方法是最好的IMO,但如果第一种方法对您有效,则第二种方法会涉及更多,甚至可能会导致过度杀伤。