7

Sto provando a configurare un ambiente di sviluppo per lo sviluppo di un'applicazione di riproduzione in un contenitore mobile. Ho creato un'immagine con sbt installato. Ho poi mappare la cartella del progetto sul mio ospite al contenitore come un volume ed eseguire shell in modalità interattiva:Caricamento automatico del framework di riproduzione nel contenitore mobile

docker run -v /Users/jorgen/dev/play-sbt-docker/app:/data/app -w /data/app -p 9999:9000 -i -t jorgenfb/sbt /bin/bash 

Ho poi avvia l'applicazione gioco eseguendo sbt ~run. Il server di gioco inizia proprio trovare, si ricompila anche quando posso modificare il mio file sull'host:

[info] Compiling 1 Scala source to /data/app/target/scala-2.10/classes... 
[success] Compiled in 2s 

Il problema è che i cambiamenti non vengono visualizzati nel browser quando rinfresco. Non c'è nessun problema di memorizzazione nella cache poiché ho disabilitato il caching. Se eseguo l'applicazione dal mio host, tutto funziona correttamente.

Edit: Questo è il mio Dockerfile utilizzato per creare il contenitore con SBT:

FROM dockerfile/java:oracle-java8 
MAINTAINER Jørgen Borgesen 

ENV SBT_VERSION 0.13.5 

# Install sbt 
RUN cd /tmp && \ 
    wget https://dl.bintray.com/sbt/native-packages/sbt/$SBT_VERSION/sbt-$SBT_VERSION.zip && \ 
    unzip sbt-$SBT_VERSION.zip -d /usr/local && \ 
    rm sbt-$SBT_VERSION.zip 

ho fatto qualche ricerca più. All'interno del contenitore docker avvio l'applicazione di gioco in questo modo:

[ [email protected]:/data/app ]$ /usr/local/sbt/bin/sbt 
[info] Loading project definition from /data/app/project 
[info] Set current project to my-first-app (in build file:/data/app/) 
[my-first-app] $ ~run 

--- (Running the application from SBT, auto-reloading is enabled) --- 

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000 

(Server started, use Ctrl+D to stop and go back to the console...) 

[success] Compiled in 740ms 

Il caricamento della pagina nel browser funziona correttamente. Quindi cambio il mio file di indice sull'host. Questo si attiva ricompilare all'interno del contenitore:

[info] Compiling 1 Scala source to /data/app/target/scala-2.10/classes... 
[success] Compiled in 1s 

L'aggiornamento del browser mostra ancora il file indice iniziale. Anche se i cambiamenti sono stati imputati dall'applicazione di gioco all'interno del contenitore. Ho anche ispezionato i file compilati in target/scala-2.10/classes/views/html (sul mio host, dal momento che sto eseguendo l'applicazione di riproduzione nel contenitore e non sono sicuro di come collegare più terminali ad esso). I file compilati sono cambiati.

La prossima cosa che ho fatto è stata premere Ctrl-D. Questo dovrebbe riportare la console alla sbt in base al messaggio stampato sopra "(Server avviato, utilizzare Ctrl + D per interrompere e tornare alla console ...)". Tuttavia, ciò risulta nell'output seguente:

[success] Total time: 455 s, completed Sep 25, 2014 7:40:35 AM 
1. Waiting for source changes... (press enter to interrupt) 

--- (Running the application from SBT, auto-reloading is enabled) --- 

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000 

(Server started, use Ctrl+D to stop and go back to the console...) 

[info] play - Application started (Dev) 

Ora le modifiche apportate in precedenza si riflettono nel browser dopo un aggiornamento.

+0

Avete controllato se i cambiamenti e dei file aggiornati di modifica dei file date-stanno facendo attraverso al contenitore Docker? –

+0

I file sono stati modificati, sia per l'origine che per le classi compilate. Ho anche fatto qualche ricerca in più (vedi modifica), ma non sono più vicino a una soluzione. – jorgenfb

+0

Sono felice che tu abbia trovato una soluzione alternativa. Sfortunatamente penso che sia attualmente un problema difficile rilevare in modo affidabile le modifiche del filesystem dalla JVM. –

risposta

10

Ho risolto il problema (sorta di). Il problema non è specifico né per la finestra mobile né per la struttura di gioco, ma è legato a come vengono rilevate le modifiche ai file utilizzando JNotify (la riproduzione utilizza questa libreria). Le modifiche vengono rilevate utilizzando gli hook nativi del file system. Questi hook non sono disponibili nelle cartelle condivise per macchine virtuali (eseguo il servizio finestra mobile in una macchina virtuale poiché sono su OSX). Ciò significa che l'unico modo per rilevare automaticamente le modifiche ai file consiste nell'utilizzare una strategia di polling. Supporta i framework framework nella versione 2.3.2 e successive. Per abilitare, aggiungere questo al vostro build.sbt:

PlayKeys.playWatchService := play.sbtplugin.run.PlayWatchService.sbt(pollInterval.value) 

La risposta è tratto da un posto problema su github: Play 2.3.2 auto reload is not working on shared folder

aggiornamento per il gioco 2.4: Gioca 2.4 rinomina il parametro di configurazione. Ecco come abilitare il polling in 2.4:

PlayKeys.fileWatchService := play.runsupport.FileWatchService.sbt(pollInterval.value) 

Grazie a philipphoffmann per la sua risposta con le informazioni aggiornate. Aggiunta alla mia risposta per fornire una soluzione per entrambi 2.3 e 2.4.

Aggiornamento: Ho appena scoperto uno strumento utile per gli utenti OSX: docker-osx-dev. Usa rsync per mantenere sincronizzati l'host e i file system virtuali. Ciò attiverà il cambio del file system sulla tua macchina virtuale.

+0

Grazie per la spiegazione. Hai provato di nuovo da quando Docker è ora disponibile "nativamente" su MacOS? – Maxence

3

Per il gioco 2.4 questo sarebbe:

PlayKeys.fileWatchService := play.runsupport.FileWatchService.sbt(pollInterval.value)