7

में फ्रेमवर्क ऑटो-लोडिंग चलाएं मैं एक डॉकर कंटेनर में एक प्ले एप्लिकेशन विकसित करने के लिए एक विकास वातावरण स्थापित करने की कोशिश कर रहा हूं। मैंने एसबीटी स्थापित के साथ एक छवि बनाई है। मैं तो एक मात्रा के रूप में कंटेनर के लिए अपने मेजबान पर प्रोजेक्ट फ़ोल्डर नक्शा और इंटरैक्टिव मोड में खोल चलाएँ:डॉकर कंटेनर

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

मैं तो sbt ~run चलाकर खेलने आवेदन शुरू होता है। खेलने सर्वर सिर्फ लगता है शुरू होता है, तो यह और भी जब मैं मेजबान पर मेरी फ़ाइलों को संपादित recompiles:

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

समस्या यह है कि परिवर्तन ब्राउज़र में प्रकट नहीं होता है जब मैं ताज़ा है। कैशिंग अक्षम करने के बाद से कोई कैशिंग समस्या नहीं है। अगर मैं अपने मेजबान से एप्लिकेशन चलाता हूं, तो सब कुछ ठीक काम करता है।

संपादित करें: यह मेरा Dockerfile एसबीटी के साथ कंटेनर बनाने के लिए प्रयोग किया जाता है:

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 

मैं कुछ और अधिक शोध किया। डॉकर कंटेनर के अंदर मैं इस तरह के प्ले एप्लिकेशन को शुरू करता हूं:

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

मेरे ब्राउज़र में पृष्ठ लोड करना ठीक काम करता है। मैं फिर मेजबान पर अपनी अनुक्रमणिका फ़ाइल बदलता हूं। यह ट्रिगर कंटेनर के अंदर पुन: संकलित:

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

मेरा ब्राउज़र रीफ्रेश करना अभी भी प्रारंभिक अनुक्रमणिका फ़ाइल दिखाता है। भले ही परिवर्तन कंटेनर के अंदर प्ले एप्लिकेशन द्वारा पिक किया गया हो। मैंने target/scala-2.10/classes/views/html में संकलित फ़ाइलों का भी निरीक्षण किया है (मेरे मेजबान पर, क्योंकि मैं कंटेनर में प्ले एप्लिकेशन चला रहा हूं और मुझे यकीन नहीं है कि इसमें कई टर्मिनल कैसे संलग्न करें)। संकलित फाइलें बदल गई हैं।

अगली बात मैंने Ctrl-D दबा रही थी। इसे ऊपर दिए गए मुद्रित संदेश के अनुसार एसबीटी कंसोल पर वापस लेना चाहिए "(सर्वर शुरू हुआ, रोकने के लिए Ctrl + D का उपयोग करें और कंसोल पर वापस जाएं ...)"। हालांकि इसके परिणामस्वरूप निम्न आउटपुट में परिणाम:

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

अब मेरे द्वारा किए गए परिवर्तन रीफ्रेश के बाद ब्राउज़र में दिखाई देते हैं।

+0

आप अगर फ़ाइल परिवर्तन और अपडेट की गई फ़ाइल संशोधन दिनांक-कर रहे हैं के माध्यम से यह डोकर कंटेनर के लिए कर रही है जांच की है? –

+0

फाइलें बदल गई हैं, दोनों स्रोत और संकलित कक्षाएं। मैंने कुछ और शोध भी किया (संपादन देखें), लेकिन मैं समाधान के करीब नहीं हूं। – jorgenfb

+0

मुझे खुशी है कि आपको एक कामकाज मिला। दुर्भाग्य से मुझे लगता है कि वर्तमान में JVM से फाइल सिस्टम परिवर्तनों का विश्वसनीय रूप से पता लगाने में एक मुश्किल समस्या है। –

उत्तर

10

मैंने समस्या हल की (प्रकार)। यह मुद्दा या तो डॉकर या प्ले फ्रेमवर्क के लिए विशिष्ट नहीं है, लेकिन JNotify (Play इस लाइब्रेरी का उपयोग करता है) का उपयोग करके फ़ाइलों में परिवर्तनों का पता लगाया जाता है। मूल फ़ाइल सिस्टम हुक का उपयोग कर परिवर्तनों का पता लगाया जाता है। ये हुक वर्चुअल मशीनों के लिए साझा फ़ोल्डरों में उपलब्ध नहीं हैं (मैं ओएसएक्स पर एक वीएम मशीन में डॉकर सेवा चलाता हूं)। इसका मतलब है कि फ़ाइल परिवर्तनों का स्वचालित रूप से पता लगाने का एकमात्र तरीका एक मतदान रणनीति का उपयोग करना है। संस्करण 2.3.2 और बाद में फ्रेमवर्क का समर्थन करता है। खेलने के लिए 2.4 Play 2.3.2 auto reload is not working on shared folder

अपडेट:: सक्षम करने के लिए, यह आपके build.sbt में जोड़ें:

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

जवाब GitHub पर एक मुद्दा पद से लिया जाता है प्ले 2.4 का नाम बदलता है config पैरामीटर। 2.4:

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

अद्यतन जानकारी के साथ अपने उत्तर के लिए फिलिपफॉफ़मैन को धन्यवाद। 2.3 और 2.4 दोनों के लिए समाधान प्रदान करने के लिए इसे मेरे उत्तर में जोड़ा गया।

अद्यतन: मैंने अभी ओएसएक्स उपयोगकर्ताओं के लिए एक आसान टूल खोजा है: docker-osx-dev। यह मेजबान और वर्चुअल फ़ाइल सिस्टम को सिंक में रखने के लिए rsync का उपयोग करता है। यह आपकी वर्चुअल मशीन पर फ़ाइल सिस्टम परिवर्तन को ट्रिगर करेगा।

+0

आपकी व्याख्या के लिए धन्यवाद। क्या आपने फिर से प्रयास किया क्योंकि डॉकर अब मैकोज़ पर "मूल रूप से" उपलब्ध है? – Maxence

3

खेलने 2.4 के लिए यह होगा:

PlayKeys.fileWatchService := play.runsupport.FileWatchService.sbt(pollInterval.value) 
संबंधित मुद्दे