我是新手到斯卡拉的世界里,我尝试运行该项目,了解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
我查询就是为什么它被关闭,当我在泊坞窗运行?如何永远跑的?
您没有-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,但也更复杂,可能矫枉过正,如果第一种方法适合你。