7

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.

+0

Czy można sprawdzić, czy zmiany-and-file aktualizowane są daty modyfikacji pliku czyni go aż do pojemnika Docker? –

+0

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

+0

Cieszę się, że znalazłeś obejście. Niestety uważam, że obecnie trudnym problemem jest niezawodne wykrywanie zmian w systemie plików z JVM. –

Odpowiedz

10

Rozwiązałem problem (rodzaj). Problem nie dotyczy tylko okna dokowanego lub ramy odtwarzania, ale jest związany z tym, jak zmiany w plikach są wykrywane za pomocą JNotify (odtwarzanie korzysta z tej biblioteki). Zmiany są wykrywane za pomocą natywnych hooków systemu plików. Haki te nie są dostępne w folderach udostępnionych dla maszyn wirtualnych (uruchamiam usługę dokowania na maszynie wirtualnej, ponieważ jestem na OSX). Oznacza to, że jedynym sposobem automatycznego wykrywania zmian w plikach jest użycie strategii odpytywania. Odtwarzaj obsługę ram w wersji 2.3.2 i nowszych. Aby włączyć, dodać do swojej build.sbt:

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

Odpowiedź pochodzi z wątku emisyjnej na github: Play 2.3.2 auto reload is not working on shared folder

Aktualizacja 2.4 do gry: Zagraj 2.4 zmienia nazwę parametru konfiguracyjnego. Oto, jak włączyć polling w wersji 2.4:

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

Dzięki philipphoffmannowi za odpowiedź na zaktualizowane informacje. Dodałem to do mojej odpowiedzi, aby zapewnić rozwiązanie zarówno dla wersji 2.3, jak i 2.4.

Aktualizacja: Właśnie odkryłem przydatne narzędzie dla użytkowników OSX: docker-osx-dev. Używa rsync do synchronizacji hosta i wirtualnych systemów plików. Spowoduje to zmianę systemu plików na maszynie wirtualnej.

+0

Dziękuję za wyjaśnienia. Czy próbowałeś ponownie, ponieważ Docker jest teraz dostępny "natywnie" na MacOS? – Maxence

3

Play 2.4 będzie to:

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