2016-02-09 14 views
6

हाय मैं डॉकर के लिए नया हूं और स्क्रैच से एक नई छवि लिखने की कोशिश कर रहा हूं। मैं इस डॉकरफ़ाइल को एक ही निर्देशिका में उपलब्ध एक सरल जावा प्रोग्राम को संकलित और चलाने के लिए लिख रहा हूं।एक जावा प्रोग्राम चलाने के लिए डॉकरफ़ाइल

यहां डॉकरफ़ाइल है।

FROM scratch 
CMD javac HelloWorld.java 
CMD java HelloWorld 

डोकर निर्माण सफल हुआ नीचे के रूप में

[[email protected] myjavadir]# docker build -t runhelloworld . 
Sending build context to Docker daemon 3.072 kB 
Sending build context to Docker daemon 
Step 0 : FROM scratch 
---> 
Step 1 : CMD javac HelloWorld.java 
---> Running in 7298ad7e902f 
---> f5278ae25f0c 
Removing intermediate container 7298ad7e902f 
Step 2 : CMD java HelloWorld 
---> Running in 0fa2151dc7b0 
---> 25453e89b3f0 
Removing intermediate container 0fa2151dc7b0 
Successfully built 25453e89b3f0 

दिखाया लेकिन जब मैं चलाने का प्रयास है, यह निम्न त्रुटि फेंकता है:

[[email protected] myjavadir]# docker run runhelloworld 
exec: "/bin/sh": stat /bin/sh: no such file or directory 
Error response from daemon: Cannot start container 676717677d3f1bf3b0b000d68b60c32826939b8c6ec1b5f2e9876969c60e22a4: [8] System error: exec: "/bin/sh": stat /bin/sh: no such file or directory 
[[email protected] myjavadir]# exec: "/bin/sh": stat /bin/sh: no such file or directory 
bash: exec:: command not found 

कृपया एक ही हल करने में मदद।


RUN पर दूसरी पंक्ति चैन करने के बाद अद्यतन करें।

[[email protected] myjavadir]# docker build -t runhelloworld . 
Sending build context to Docker daemon 3.584 kB 
Sending build context to Docker daemon 
Step 0 : FROM scratch 
---> 
Step 1 : RUN javac HelloWorld.java 
---> Running in fdef2d65ac58 
exec: "/bin/sh": stat /bin/sh: no such file or directory [8] 
System error: exec: "/bin/sh": stat /bin/sh: no such file or directory 
+0

आप, जावा से बजाय खरोंच से कोशिश कर सकते हैं, क्योंकि यह एक जावा आवेदन –

+0

http://stackoverflow.com/questions/31696439/how-to-build-a- चलाने के लिए जावा के न्यूनतम निर्भरता की जरूरत है डॉकर-कंटेनर-फॉर-ए-जावा-ऐप/31710204 # 31710204 –

उत्तर

8

स्पष्टीकरण

Dockerfile reference से

There can only be one CMD instruction in a Dockerfile. If you list more than one CMD then only the last CMD will take effect.

है यही कारण है कि javac आदेश निष्पादित नहीं है और no such file or directory में अपने कंटेनर परिणाम शुरू कर मिला था।

CMD और ENTRYPOINT उन कार्यों के लिए उपयोग किया जाता है जिन्हें एक बार कंटेनर (एंट्रीपॉइंट स्तर) निष्पादित करने के बाद शुरू किया जाएगा।

The main purpose of a CMD is to provide defaults for an executing container.

लाइन CMD java HelloWorld पर लागू होने वाला है, लेकिन CMD javac HelloWorld.java जो एक निर्माण कदम की अधिक है के लिए नहीं

। यही है RUN के लिए है।

समाधान

बदलें RUN javac HelloWorld.java को दूसरी पंक्ति।

FROM scratch 
RUN javac HelloWorld.java 
CMD java HelloWorld 

The resulting committed image [from line two] will be used for the next step in the Dockerfile.

अद्यतन

Diyoda के रूप में बताया, यह सुनिश्चित करें कि FROM छवि आपूर्ति जावा बनाते हैं।

+0

इसे आजमाया। अब डॉकर एक ही त्रुटि को फेंकने का निर्माण –

+0

[रूट @ hadoop01 myjavadir] # डॉकर बिल्ड -ट runhelloworld। डोकर डेमॉन 3.584 करने के लिए संदर्भ का निर्माण kB भेजा जा रहा है डोकर डेमॉन को संदर्भ निर्माण चरण 0 भेजा जा रहा है: खरोंच से ---> चरण 1: भागो javac HelloWorld.java ---> fdef2d65ac58 कार्यकारी में चल रहा है: "/ bin/sh ": stat/bin/sh: ऐसी कोई फ़ाइल या निर्देशिका [8] सिस्टम त्रुटि: निष्पादन:"/bin/sh ": stat/bin/sh: ऐसी कोई फ़ाइल या निर्देशिका –

+0

क्या आप निश्चित रूप से जावा और हैलोवर्ल्ड हैं .java फ़ाइल मौजूद हैं? त्रुटि ऐसा लगता है कि वे नहीं हैं। – michaelbahr

0

इसे चलाने का एक और तरीका एक खोल फ़ाइल के साथ हो सकता है।

CMD ["/bin/bash", "-ex", "run.sh"] 

और आपकी run.sh फ़ाइल में आप जावैक और जावा कमांड चला सकते हैं। आधार छवि के रूप में या "ubuntu" छवि पर JDK स्थापित:

1

एक और तरीका है ...

  1. आप "8 जावा" का उपयोग करने के लिए है।
  2. निर्माण छवि

    docker build -t imagename . 
    
  3. रन यह (कंटेनर के लिए Helloworld.java बढ़ते)

    docker run -it -v ~/system-path:/javafolder imagename 
    

प्रकार इन आदेशों container-

cd javafolder 

javac HelloWorld.java 

java HelloWorld 
0

अंदर निष्पादित करने के लिए आप डॉक लिखकर खुद को बचा सकते हैं erfile के साथ ही, अपने स्थानीय छवि रेपो में जावा छवि है, अपने प्रोग्राम को पास करके अपने जावा प्रोग्राम को संकलित करें और चलाएं, यह बहुत आसान है।

$ docker run java:alpine java -version 

$ docker run --rm -v $PWD:/app -w /app java:alpine javac Main.java 

$ docker run --rm -v $PWD:/app -w /app java:alpine java Main 
संबंधित मुद्दे