Próbuję skonfigurować środowisko programistyczne do rozwijania aplikacji odtwarzania w kontenerze dokowania. Stworzyłem obraz z zainstalowanym sbt. I wtedy mapować folder projektu na moim hosta do pojemnika jako objętości i uruchomić powłokę w trybie interaktywnym:Automatyczne ładowanie frameworka w kontenerze dokowania
docker run -v /Users/jorgen/dev/play-sbt-docker/app:/data/app -w /data/app -p 9999:9000 -i -t jorgenfb/sbt /bin/bash
Następnie uruchamia aplikację Play działa sbt ~run
. Serwer Odtwarzanie rozpocznie prostu znaleźć, nawet recompiles kiedy edytować pliki na komputerze:
[info] Compiling 1 Scala source to /data/app/target/scala-2.10/classes...
[success] Compiled in 2s
Problemem jest to, że zmiany nie są wyświetlane w przeglądarce, gdy odświeżam. Nie ma problemu z buforowaniem, ponieważ wyłączyłem buforowanie. Jeśli uruchomię aplikację z mojego hosta, wszystko działa poprawnie.
Edit: To mój Dockerfile wykorzystywane do tworzenia kontenera 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
zrobiłem kilka badań. Wewnątrz kontenera dokującego uruchamiam aplikację odtwarzania w następujący sposób:
[ [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
Ładowanie strony w przeglądarce działa poprawnie. Następnie zmienię plik indeksu na hoście. To powoduje ponowną kompilację wewnątrz kontenera:
[info] Compiling 1 Scala source to /data/app/target/scala-2.10/classes...
[success] Compiled in 1s
Odświeżanie przeglądarki nadal pokazuje początkowy plik indeksu. Nawet jeśli zmiany zostały przerwane przez aplikację odtwarzania wewnątrz kontenera. Sprawdziłem również skompilowane pliki w target/scala-2.10/classes/views/html
(na moim hoście, ponieważ używam aplikacji odtwarzania w kontenerze i nie jestem pewien, jak podłączyć do niej wiele terminali). Skompilowane pliki zostały zmienione.
Następną rzeczą, którą zrobiłem było naciśnięcie Ctrl-D. To powinno zabrać mnie z powrotem do konsoli sbt zgodnie z wydrukowaną wiadomością powyżej "(Uruchomiono serwer, użyj Ctrl + D, aby zatrzymać i wrócić do konsoli ...)". Jednak powoduje to następujące dane wyjściowe:
[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)
Zmiany wprowadzone wcześniej są odzwierciedlane w przeglądarce po odświeżeniu.
Czy można sprawdzić, czy zmiany-and-file aktualizowane są daty modyfikacji pliku czyni go aż do pojemnika Docker? –
Pliki uległy zmianie zarówno w klasie źródłowej, jak i skompilowanej. Zrobiłem też więcej badań (patrz edycja), ale nie jestem bliżej rozwiązania. – jorgenfb
Cieszę się, że znalazłeś obejście. Niestety uważam, że obecnie trudnym problemem jest niezawodne wykrywanie zmian w systemie plików z JVM. –