2 votes

Problèmes dans sbt - dockerisation du projet scala

Je suis un nouveau venu dans le monde de Scala, j'essaie d'exécuter ce projet pour comprendre le flux de travail Scala Rest Play : https://developer.lightbend.com/guides/play-rest-api/index.html

Je suis en mesure d'exécuter ce projet avec succès à l'aide de la fonction sbt run commande

/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...)

J'essaie de mettre ce projet dans 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"]

Il est construit avec succès en tant qu'image docker

Mais quand je lance cette image docker, elle ouvre le port : 9000 (comme nous le faisons sans docker) et immédiatement le port se ferme comme ci-dessous

--- (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

Ma question est de savoir pourquoi il s'arrête lorsque je l'exécute dans docker ? Comment faire fonctionner ce système à l'infini ?

3voto

francoisr Points 1396

Vous exécutez votre conteneur sans l'option -it (qui vous permettent de vous connecter à son entrée standard comme si vous étiez dans un terminal), mais votre programme attend une entrée lorsqu'il démarre ("appuyez sur entrée..."). Votre programme attend probablement une entrée sur stdin et lit probablement un EOF (end of file) lorsqu'il démarre, ce qui provoque son arrêt, et donc l'arrêt de votre conteneur.

Si vous voulez faire fonctionner votre conteneur en arrière-plan, il me semble que vous avez deux options :

1) Exécutez votre conteneur en utilisant docker run -it -p 9000:9000 <your_other_options> <your_image> puis de le mettre en arrière-plan en utilisant CTRL+P puis CTRL+Q . Vous verrez que votre conteneur est toujours en cours d'exécution dans docker ps . Pour le rattacher, il suffit d'utiliser docker attach <your_container> . Bien sûr, cette approche ne sera pas applicable si vous voulez faire fonctionner votre conteneur sur, disons, un serveur de test unitaire où vous ne voudrez pas faire manuellement la commande CTRL+P/Q chose.

2) Modifiez votre serveur de manière à ce qu'il puisse fonctionner entièrement en arrière-plan, sans intervention de l'utilisateur. Dans ce cas, la façon de mettre fin à votre programme sera de lui envoyer une commande SIGINT signal. C'est ce que CTRL+C habituellement, et aussi ce que fait le docker stop <your_container> vous le ferez. Vous voudrez probablement gérer correctement ce signal dans votre code Scala, afin de pouvoir faire le ménage au lieu de vous planter brusquement. Cela peut être fait en utilisant un crochet d'arrêt . Les crochets d'arrêt proviennent de la JVM et ne sont pas spécifiques à Scala. Vous devez vous occuper d'arrêter manuellement tout thread / sous-processus dans votre crochet d'arrêt.

La deuxième méthode est la meilleure selon l'IMO, mais elle est également plus complexe et probablement excessive si la première méthode fonctionne pour vous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X