2014-11-11 4 views
9

Ho una configurazione di sviluppo in cui ho bisogno di più contenitori che eseguono servizi diversi, e sto cercando di usare Fig per raggiungere questo obiettivo. Tutto il resto funziona bene, ma uno di questi servizi è un'app Play Framework e non vuole rimanere in esecuzione a meno che non si ottenga uno pseudo-TTY. Ciò andrebbe bene e bene, ma dal momento che voglio coordinare questi contenitori multipli, voglio fig up, e tale comando non sembra allocare pseudo-TTY, quindi il processo muore immediatamente dopo l'avvio e tutti i contenitori insieme ad esso.Mantenere un'app di gioco Play in esecuzione in un contenitore Docker senza uno pseudo-TTY

Ho creato a repository with a showcase of this problem che chiunque può solo clonare ed eseguire, le istruzioni sono nel README. Se qualcuno può fare luce su come creare per es. uno script di middleman che manterrebbe l'app in esecuzione, o qualsiasi altra soluzione in cui potrei creare il mio contenitore collegato, fig up, sarebbe fantastico.

In alternativa, se qualcuno utilizza altri metodi di coordinamento di contenitori multipli come questo, come forse un simpatico runner di script di shell che gestisce le cose, accolgo con favore le tue intuizioni.

modifica: Ho modificato la risposta accettata perché quella nuova in realtà risolve il problema. La soluzione alternativa ha comunque informazioni preziose.

+0

Walp, mi sono arreso. Dato che Play Framework contiene il packager nativo di sbt, si può './activator mobile: stage' e quindi eseguirlo e crearlo. Vedi http://www.scala-sbt.org/sbt-native-packager/DetailedTopics/docker.html. – Ilkka

risposta

8

Il colore Fig è stato sostituito da Docker Compose e in il file docker-compose.yml è ora possibile aggiungere l'impostazione stdin_open: true, che dovrebbe risolvere questo problema:

web: 
    image: brikis98/ping-play 
    ports: 
    - "9000:9000" 
    stdin_open: true 

Nell'esempio di cui sopra, l'immagine del brikis98/ping-play è un Play che esegue activator run per impostazione predefinita. Se eseguo docker-compose up nel file YAML in alto, l'app Play si avvia e continua a funzionare anziché uscire immediatamente.

+0

Brillante, grazie! – Ilkka

0

fig run dovrebbe utilizzare il terminale TTY. quindi potresti provare

fig run test ./activator start 
+0

Grazie, ma questo non fa quello che fa. – Ilkka

6

A Play! eseguire il comando orchestrato tramite Fig al momento uscirà sempre una volta avviato. È lo stesso comportamento se hai ripreso il contenitore creato da Fig (finestra mobile start -i). Fondamentalmente questo rispecchia ciò che accade quando lanciate il REPL di Play/SBT/Activator tramite un comando di esecuzione come un demone di sfondo Docker che uscirà anche (finestra mobile gira -d).

La soluzione, come già commentato da Ilkka, è di impacchettare l'applicazione Play in modo che sia in grado di funzionare autonomamente. O tramite il palco e/o avviare i comandi https://playframework.com/documentation/2.3.x/Production o come distribuzione tramite https://playframework.com/documentation/2.3.x/ProductionDist.

Per esempio, se un'immagine Docker include sorgente dell'applicazione quindi è possibile aggiungere il comando fase ad esso

ADD myapplication /var/local/application 

WORKDIR /var/local/application 

RUN /usr/local/bin/activator stage 

E nel fig.yml vostro comando può essere

command: target/universal/stage/bin/myapplication 

Si può vedere an example Dockerfile e yml file con questo progetto Docker Compose (successore di Fig)