Docker: पैरेंट डायरेक्टरी से एक फाइल जोड़ना


186

मेरे में Dockerfile पास में:

ADD ../../myapp.war /opt/tomcat7/webapps/

वह फ़ाइल ls ../../myapp.warमुझे सही फ़ाइल के रूप में मौजूद है, लेकिन जब मैं निष्पादित करता sudo docker build -t myapp .हूं तो मुझे मिल गया है:

Step 1 : ADD ../../myapp.war /opt/tomcat7/webapps/
2014/07/02 19:18:09 ../../myapp.war: no such file or directory

क्या किसी को पता है कि इसे सही तरीके से क्यों और कैसे करना है?


2
कुछ वर्कअराउंड्स सुपरसुअर.com
questions/842642

जवाबों:


225

आप मूल निर्देशिका से Dockerfile का निर्माण कर सकते हैं:

docker build -t <some tag> -f <dir/dir/Dockerfile> .

3
धन्यवाद! यह एक स्थानीय बॉक्स पर ठीक काम करता है, लेकिन डॉकर हब छवि का निर्माण करने में विफल रहता है क्योंकि यह अपनी उसी निर्देशिका से करने की कोशिश करता है (tbh, बस एक सामान्य रूप से क्या उम्मीद करेगा)। क्या डॉकटर हब में एक ही चाल करने का कोई तरीका है?
मार्सेल हर्नांडेज़

मेरी जानकारी में नहीं। आप स्वचालित बिल्ड का उपयोग करने के बजाय छवि को रजिस्ट्री में धकेल सकते हैं।
बोईद

2
@ eduncan911 मुझे नहीं लगता कि जिस समय मैं अपनी टिप्पणी लिख रहा हूं उस समय यह पदावनत है। उन्होंने तब से अपना मन बदल लिया है? यदि मैं गलत हूं, तो क्या आप उस दस्तावेज से लिंक कर सकते हैं जहां यह कहता है कि इसे पदावनत किया जा रहा है। धन्यवाद!
सर्वव्यापी जुलाब

6
-f डॉक्स के अनुसार प्रतिरूपित नहीं किया जा सकता है -> एक डॉकरीफाइल निर्दिष्ट करें (-f) : डॉक्स.डॉकर.com
रे

6
@ eduncan911 आप अपनी टिप्पणी हटा सकते हैं क्योंकि यह स्पष्ट रूप से पदावनत नहीं है? मैं आपकी टिप्पणी के कारण शुरू में इस जवाब पर छोड़ दिया।
क्रिस एंडरसन

103

दुर्भाग्य से, (व्यावहारिक और सुरक्षा कारणों से मुझे लगता है), यदि आप स्थानीय सामग्री को जोड़ना / कॉपी करना चाहते हैं, तो इसे उसी रूट रूट के तहत स्थित होना चाहिए Dockerfile

से प्रलेखन :

<Src> पथ निर्माण के संदर्भ में होना चाहिए; आप ADD ../something / कुछ नहीं कर सकते , क्योंकि डॉक बिल्ड का पहला चरण डॉक्यूमेंट डेमन को संदर्भ निर्देशिका (और उपनिर्देशिका) भेजना है।

संपादित करें: अब -fआपके डॉकरीफाइल का रास्ता तय करने के लिए एक विकल्प ( ) है; इसका उपयोग आप जो चाहते हैं उसे प्राप्त करने के लिए किया जा सकता है, @Boedy की प्रतिक्रिया nelow देखें।


22
क्या इसके लिए "स्वच्छ" वर्कअराउंड है? मैं इसे समायोजित करने के लिए अपनी पूरी परियोजना निर्देशिका का पुनर्गठन नहीं करूंगा।
ben_frankly

जैसा कि @ गुंटर ने कहा, यहाँ एक वर्कअराउंड है superuser.com/a/842690/136024 ... क्या यह वास्तव में "साफ" है? अच्छी तरह से कम से कम यह एक "वर्कअराउंड" :)
एंथनी ओ।



9

स्वीकृत उत्तर का समर्थन करने के लिए कुछ कोड स्निपेट जोड़ना।

निर्देशिका संरचना:

setup/
 |__docker/DockerFile
 |__target/scripts/<myscripts.sh>
src/
 |__<my source files>

डॉकर फ़ाइल प्रविष्टि:

RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/scripts/
RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/src/
WORKDIR /home/vagrant/dockerws/chatServerInstaller

#Copy all the required files from host's file system to the container file system.
COPY setup/target/scripts/install_x.sh scripts/
COPY setup/target/scripts/install_y.sh scripts/
COPY src/ src/

कमांड डॉक इमेज बनाने के लिए उपयोग किया जाता है

docker build -t test:latest -f setup/docker/Dockerfile .

महान दृष्टिकोण। क्या यह संभव है कि कोड भी साझा करें install_x.sh?
अरीफुल हक

4

संगीतकार का उपयोग करने वालों के लिए समाधान मूल फ़ोल्डर की ओर इशारा करते हुए वॉल्यूम का उपयोग करना है :

#docker-composer.yml

foo:
  build: foo
  volumes:
    - ./:/src/:ro

लेकिन मुझे पूरा यकीन है कि डॉकफाइल में वॉल्यूम के साथ खेल किया जा सकता है ।


3
यह नहीं कर सकता। नोट: होस्ट निर्देशिका, इसकी प्रकृति, होस्ट-निर्भर है। इस कारण से, आप Dockerfile से एक होस्ट निर्देशिका माउंट नहीं कर सकते क्योंकि निर्मित छवियां पोर्टेबल होनी चाहिए। एक मेजबान निर्देशिका सभी संभावित मेजबानों पर उपलब्ध नहीं होगी। docs.docker.com/engine/tutorials/dockervolumes/…
Peeter Kokk

4

चूंकि -fएक और समस्या थी, इसलिए मैंने एक और समाधान विकसित किया।

  • पैरेंट फोल्डर में बेस इमेज बनाएं
  • आवश्यक फ़ाइलों को जोड़ा गया।
  • इस छवि का उपयोग प्रोजेक्ट के लिए आधार छवि के रूप में किया जाता है जो एक वंशज फ़ोल्डर में है।

-fझंडा क्योंकि मेरी मेरी समस्या हल नहीं करता है onbuildएक फ़ोल्डर में एक फ़ाइल के लिए छवि दिखता है और इस तरह कॉल करने के लिए किया था:

-f foo/bar/Dockerfile foo/bar

के बजाय

-f foo/bar/Dockerfile .

यह भी ध्यान दें कि यह -fध्वज के रूप में कुछ मामलों के लिए केवल समाधान है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.