Проблемы в sbt - dockerisation проекта scala - PullRequest
0 голосов
/ 05 февраля 2019

Я новичок в мире 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...)

Я пытаюсь поместить этот проект в докер

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

Мой вопрос, почему он закрывается, когда я запускаю в докере?Как запустить это навсегда?

1 Ответ

0 голосов
/ 05 февраля 2019

Вы запускаете свой контейнер без опций -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, чтобы вы могли выполнить некоторую очистку вместо внезапного сбоя.Это можно сделать, используя отключающий хук .Отключение происходит от JVM и не зависит от Scala.Вам следует позаботиться о ручной остановке любого потока / подпроцесса в вашем хуке shutdown.

Второй метод лучше всего подходит для IMO, но он также более сложный и, вероятно, излишний, если первый метод работает для вас.

...