कुछ ही मिनटों के लिए docker पर JavaFX ऐप नहीं चला सकते


9

मैंने एक अलग वेब ऐप के लिए संचार सेवा के रूप में उपयोग किए जाने वाले एप्लिकेशन को विकसित किया। मेरे पास वेब ऐप "0 डॉकटराइज़िंग" के मुद्दे थे, लेकिन यह सेवा एक बुरा सपना साबित हो रही है। यह जावाएफ़एक्स पर आधारित है और एक ऐसी संपत्ति है जिसे उपयोगकर्ता द्वारा कॉन्फ़िगर फ़ाइल में सेट किया जा सकता है जो इसे बनाता है ताकि ऐप किसी भी विंडो, मेनू, कंटेनर आदि को इनिशियलाइज़ न करे। यह "हेडलेस" मोड है (निश्चित रूप से सही नहीं है हेडलेस ...) प्रभावी रूप से सेवा ऐप को पृष्ठभूमि सेवा में बदल देता है। मुझे यह कहते हुए भी प्रस्तावना दें कि मेरे विंडोज़ 10 मशीन पर चलने पर यह ऐप पूरी तरह से त्रुटिपूर्ण रूप से काम करता है और मैंने इसे बिना किसी मुद्दे के साथ कई अन्य मशीनों (सभी गैर-डॉक्यूमेंटेड) पर तैनात किया है।

यहाँ मैं के साथ आया dockerfile है:

FROM openjdk:13.0.1-slim
RUN apt-get update && apt-get install libgtk-3-0 libglu1-mesa -y && apt-get update
VOLUME /tmp
ADD Some_Service-0.0.1-SNAPSHOT.jar Some_Service-0.0.1-SNAPSHOT.jar
ADD lib lib
ADD config.properties config.properties
ENTRYPOINT ["java", "--module-path", "lib/javafx-sdk-13", "-jar", "Some_Service-0.0.1-SNAPSHOT.jar"]

मैं कंटेनर बनाने के लिए इस कमांड का उपयोग करता हूं:

docker run -t --name Some_Service -e DISPLAY=192.168.1.71:0.0 -e SERVICE_HOME= --link mySQLMD:mysql some_service

VcXsrv मानकर मेरे पीसी पर चल रहा है, ऐप सही ढंग से शुरू होता है, हालांकि यह पहली बार शुरू होने पर ये चेतावनी देता है:

libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
Prism-ES2 Error : GL_VERSION (major.minor) = 1.4

मुद्दा यह है कि यह केवल 2 मिनट के लिए काम करता है। आखिरकार कंटेनर इस त्रुटि के साथ आता है और दुर्घटनाग्रस्त हो जाता है:

Gdk-Message: 15:28:54.770: java: Fatal IO error 11 (Resource temporarily unavailable) on X server 192.168.1.71:0.0.

मैं समझता हूं कि शुरुआती संदेश कंटेनर के कारण हैं, जिसमें कोई एनवीडिया चालक नहीं है, लेकिन सॉफ्टवेयर पाइपलाइन में गिरावट ठीक काम करने लगती है। ईमानदारी से मुझे पता नहीं है कि घातक IO त्रुटि किस कारण से हो सकती है। मैंने अलग-अलग मेजबानों को चलाने वाले पर कोशिश की है और एक ही मुद्दा होता है।

इसे ठीक करने के लिए कोई भी विचार? इससे भी बेहतर, किसी भी विचार को कैसे एक JavaFX ऐप ट्रूली को बिना सिर के बनाना है और इसके लिए किसी भी सामान की आवश्यकता नहीं है? जब मैं बिना सिर के दौड़ता हूं, तो मैं टास्क का उपयोग करता हूं और जो जावाएएफएक्स का हिस्सा हैं, इसलिए मैं इसका इस्तेमाल नहीं कर सकता ...


कंटेनर रनटाइम (यानी -v /tmp/.X11-unix:/tmp/.X11-unix) में मेजबान एक्ससेवर को बांधने की कोशिश की है ? Xserver से जुड़ने की कोशिश करने वाले ऐप का सुझाव है कि यह "हेडलेस" नहीं है, इसके कार्यान्वयन की समीक्षा करने की आवश्यकता होगी।
मस्सेब

GPU समर्थन के साथ चलाने का प्रयास करें। "docker run -t --name some_Service --gpus all -e DISPLAY = 192.168.1.71: 0.0 -e SERVICE_HOME = - mySQLMD: mysql some_service"
arppreet

@ हर्षप्रीत मुझे यह त्रुटि देता है: डेमॉन से त्रुटि प्रतिक्रिया: डिवाइस ड्राइवर का चयन नहीं कर सका "" क्षमताओं के साथ: [[gpu]]
मार्टिन

@masseyb मैं एक विंडोज मशीन पर docker चला रहा हूँ
मार्टिन 19

जवाबों:


2

अपने कंटेनर में xvfb स्थापित करें यह एक आभासी स्क्रीन बनाता है। डॉकर फ़ाइल में परिवर्तन:

FROM openjdk:13.0.1-slim
RUN apt-get update && apt-get install libgtk-3-0 libglu1-mesa xvfb -y && 
apt-get update
VOLUME /tmp
ADD Some_Service-0.0.1-SNAPSHOT.jar Some_Service-0.0.1-SNAPSHOT.jar
ADD lib lib
ADD config.properties config.properties
apt-get install xvfb
ENV DISPLAY=:99
ADD run.sh /run.sh
RUN chmod a+x /run.sh
CMD /run.sh 

अपने प्रोजेक्ट फ़ोल्डर में नई बैश स्क्रिप्ट जोड़ें और इसे "run.sh" नाम दें

run.sh:

#!/bin/bash
#remove old 
rm /tmp/.X99-lock #needed when docker container is restarted
Xvfb :99 -screen 0 640x480x8 -nolisten tcp &
java --module-path lib/javafx-sdk-13 -jar Some_Service-0.0.1-SNAPSHOT.jar

-e DISPLAY=192.168.1.71:0.0अपने डॉक रन कमांड से हटाना न भूलें


क्या आप मुझे दिखा सकते हैं कि java -jar कमांड से एंट्री पॉइंट को कमांड में बदलकर java -jar स्टेटमेंट और xvfb कमांड दोनों को कैसे कमांड करें?
मार्टिन

मैंने यहां बताई गई विधि की कोशिश की: success.docker.com/article/… । यह मुझे निम्न त्रुटि दे रहा है: standard_init_linux.go: 211: उपयोगकर्ता प्रक्रिया निष्पादित करें "निष्पादन प्रारूप त्रुटि" के कारण
मार्टिन 20

@ मार्टिन ने अपना जवाब संपादित किया मुझे उम्मीद है कि अब यह स्पष्ट हो जाएगा।
leachim742

क्षमा करें, मैं अभी तक यूनिक्स के साथ बहुत अच्छा नहीं हूं :( मुझे यह त्रुटि तब हो रही है जब डॉक चलाने वाले अब कमांड कर रहे हैं: / बिन / श: 1: /run.sh: नहीं मिला
मार्टिन

आपको फ़ाइल को 'run.sh' बनाने की ज़रूरत है जहाँ आपकी अन्य फाइलें आपके स्नैपशॉट की तरह संग्रहीत हैं
।jar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.