7

Ich versuche, eine Entwicklungsumgebung für die Entwicklung einer Play-Anwendung in einem Andock-Container einzurichten. Ich habe ein Bild mit sbt installiert erstellt. I Karte dann den Projektordner auf meinem Host in den Behälter als Volumen und Lauf Shell im interaktiven Modus:play frame auto-loading in docker container

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

I beginnt dann das Spiel Anwendung von sbt ~run läuft. Das Spiel beginnt Server finden nur, es selbst neu kompiliert, wenn ich meine Dateien auf dem Host bearbeiten:

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

Das Problem ist, dass die Änderungen nicht im Browser angezeigt wird, wenn ich aktualisieren. Es gibt kein Caching-Problem, da ich das Caching deaktiviert habe. Wenn ich die Anwendung von meinem Host aus starte, funktioniert alles einwandfrei.

Edit: Das ist mein Dockerfile den Behälter mit sbt zu erstellen:

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 

Ich habe einige mehr Forschung. Innerhalb des Docker-Containers starte ich die Play-Anwendung wie folgt:

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

Das Laden der Seite in meinem Browser funktioniert gut. Ich ändere dann meine Indexdatei auf dem Host. Dies löst die Neukompilierung innerhalb des Containers aus:

Aktualisieren meines Browsers zeigt immer noch die ursprüngliche Indexdatei. Selbst wenn die Änderungen von der Play-Anwendung innerhalb des Containers übernommen wurden. Ich habe auch die kompilierten Dateien in target/scala-2.10/classes/views/html überprüft (auf meinem Host, da ich die Play-Anwendung im Container ausführen und ich bin mir nicht sicher, wie Sie mehrere Terminals anhängen). Die kompilierten Dateien haben sich geändert.

Das nächste, was ich tat, war Drücken von Strg-D. Dies sollte nach der obigen Meldung zurück zur sbt-Konsole führen "(Server gestartet, Strg + D drücken, um zu stoppen und zur Konsole zurückzukehren ...)". Dies führt jedoch zu der folgenden Ausgabe:

[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) 

Jetzt die Änderungen, die ich zuvor vorgenommen habe, spiegeln sich im Browser nach einer Aktualisierung.

+0

Haben Sie überprüft, ob die Datei Änderungen-und aktualisierte Datei Änderungsdaten-machen es zu dem Behälter Docker durch? –

+0

Die Dateien wurden geändert, sowohl die Quelle als auch die kompilierten Klassen. Ich habe auch etwas mehr recherchiert (siehe Edit), aber ich bin nicht näher an einer Lösung. – jorgenfb

+0

Ich bin froh, dass Sie einen Workaround gefunden haben. Leider halte ich es derzeit für ein schwieriges Problem, Dateisystemänderungen von der JVM zuverlässig zu erkennen. –

Antwort

10

Ich löste das Problem (Art). Das Problem ist nicht spezifisch für Docker oder Play-Framework, sondern bezieht sich darauf, wie Änderungen an Dateien mithilfe von JNotify erkannt werden (play verwendet diese Bibliothek). Änderungen werden mithilfe systemeigener Dateisystem-Hooks erkannt. Diese Hooks sind nicht in freigegebenen Ordnern für virtuelle Maschinen verfügbar (Ich habe den Docker-Dienst auf einem VM-Computer ausgeführt, seit ich unter OSX bin). Dies bedeutet, dass die einzige Möglichkeit, Dateiänderungen automatisch zu erkennen, die Verwendung einer Abfragestrategie ist. Play Framework-Unterstützung in Version 2.3.2 und höher. Zu aktivieren, fügen Sie diese zu Ihrer build.sbt:

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

Die Antwort wird von einer Ausgabe Post auf Github genommen: Play 2.3.2 auto reload is not working on shared folder

-Update für das Spiel 2.4: Wiedergabe 2.4 die Konfigurationsparameter umbenennt. So aktivieren Sie das Polling in 2.4:

Danke an philipphoffmann für seine Antwort mit der aktualisierten Info. Ich habe es meiner Antwort hinzugefügt, um eine Lösung für 2.3 und 2.4 zur Verfügung zu stellen.

Update: Ich habe gerade ein praktisches Tool für OSX-Benutzer entdeckt: docker-osx-dev. Es verwendet rsync, um den Host und die virtuellen Dateisysteme synchron zu halten. Dies führt zu einem Dateisystemwechsel auf Ihrer virtuellen Maschine.

+0

Vielen Dank für Ihre Erklärung. Hast du es erneut versucht, da Docker jetzt "nativ" auf MacOS verfügbar ist? – Maxence

3

Für Spiel 2.4 dies sei:

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