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.
Haben Sie überprüft, ob die Datei Änderungen-und aktualisierte Datei Änderungsdaten-machen es zu dem Behälter Docker durch? –
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
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. –