2015-03-21 27 views
68

को छोड़ दें मान लीजिए मेरे पास एक डॉकर कंटेनर है और मेरे होस्ट /hostFolder पर एक फ़ोल्डर है। अब अगर मैं इस फ़ोल्डर को डॉकर कंटेनर में वॉल्यूम के रूप में जोड़ना चाहता हूं, तो मैं इसे ADDDockerfile में या इसे वॉल्यूम के रूप में आरोहित करके कर सकता हूं।डॉकर में वॉल्यूम जोड़ें, लेकिन उप-फ़ोल्डर

अभी तक, बहुत अच्छा है।

अब /hostFolder में एक उप-फ़ोल्डर, /hostFolder/subFolder शामिल है।

मैं डोकर कंटेनर में /hostFolder माउंट करने के लिए चाहते हैं (चाहे के रूप में पढ़ने-लिखने या केवल पढ़ने के लिए कोई फर्क नहीं पड़ता, काम करता है दोनों मेरे लिए), लेकिन मुझे क्या करना नहीं यह /hostFolder/subFolder शामिल करना चाहते हैं। मैं इसे बाहर करना चाहता हूं, और मैं यह भी चाहता हूं कि डॉकर कंटेनर मेजबान पर इसे बदलने के परिणामस्वरूप, इस उप-फ़ोल्डर में परिवर्तन करने में सक्षम हो।

क्या यह संभव है? यदि हां, तो कैसे?

+1

@AbhijitSarkar कि एक बहुत ही रचनात्मक (और न ही किसी भी तरह से उपयोगी) टिप्पणी नहीं है का उपयोग करें। – Kano

+1

@ कानो यह एक टिप्पणी है, उत्तर नहीं। –

उत्तर

37

आप डोकर-लिखें, लेकिन लगातार द्वारा नजरअंदाज कर दिया उपनिर्देशिका करना चाहते हैं, तो आप docker-compose.yml में निम्न कर सकते हैं:

volumes: 
    node_modules: 
services: 
    server: 
    volumes: 
     - .:/app 
     - node_modules:/app/node_modules 

यह एक साझा मात्रा के रूप में अपने वर्तमान निर्देशिका माउंट होगा, लेकिन एक लगातार डोकर मात्रा माउंट आपके स्थानीय node_modules निर्देशिका के स्थान पर।यह @ कर्निकिक्स के उत्तर के समान है, लेकिन यह node_modules को docker-compose up रनों के बीच बने रहने की अनुमति देगा, जो वांछित व्यवहार की संभावना है।

+1

नामित वॉल्यूम्स एक बेहतर दृष्टिकोण हैं। प्रोटिप: सुनिश्चित करें कि आप एक हाइफेनेटेड वॉल्यूम नाम का उपयोग नहीं कर रहे हैं। आप एक डीबग दुःस्वप्न में अपने जीवन का एक छोटा सा हिस्सा खर्च करेंगे, केवल यह पता लगाने के लिए कि आप एक हास्यास्पद नाराजगी से एक बार फिर बेवकूफ हो गए थे। – dustintheweb

+2

"ध्यान दें कि डॉकर-लिखना इन लगातार खंडों को मार देगा।" मैक वी 17.0.5+ (और संभवतः पुराने संस्करण) के लिए डॉकर में यह सच नहीं है। 'डॉकर-कंपोज़ डाउन 'कंटेनर को हटा देगा, लेकिन वॉल्यूम तब तक जारी रहेगा जब तक कि आप' डॉकर सिस्टम प्रि्यून ' – BrDaHa

+1

जैसे कुछ चलाते हैं, यदि किसी को समझने में दिलचस्पी है * क्यों *' node_modules का उपयोग करके: 'नामित वॉल्यूम" अनदेखा करता है " डॉकर कंटेनर में/ऐप/node_modules', यह पोस्ट उपयोगी हो सकता है [कैसे डॉकर एकाधिक माउंट प्रकारों को संभालता है?] (https://stackoverflow.com/a/47873699/2235814) – ira

12

सबसे पहले, एक Dockerfile में ADD अनुदेश का उपयोग कर बहुत एक मात्रा (या तो docker run करने के लिए -v वाला तर्क या Dockerfile में VOLUME अनुदेश के माध्यम से) का उपयोग कर से अलग है। ADD और COPY आदेश docker build पर चलने पर फ़ाइलों की एक प्रतिलिपि लें। इन फ़ाइलों को अद्यतन नहीं किया जाता है जब तक कि docker build कमांड के साथ एक ताजा छवि नहीं बनाई जाती है। इसके विपरीत, वॉल्यूम का उपयोग करना अनिवार्य रूप से कह रहा है "इस निर्देशिका को कंटेनर छवि में संग्रहीत नहीं किया जाना चाहिए, इसके बजाय मेजबान पर एक निर्देशिका का उपयोग करें"; जब भी वॉल्यूम के अंदर एक फ़ाइल बदल जाती है, मेजबान और कंटेनर दोनों तुरंत इसे देखेंगे।

मुझे विश्वास नहीं है कि आप वॉल्यूम का उपयोग करके जो चाहते हैं उसे प्राप्त कर सकते हैं, यदि आप ऐसा करना चाहते हैं तो आपको अपनी निर्देशिका संरचना पर पुनर्विचार करना होगा।

हालांकि, COPY (जिसे ADD पर प्राथमिकता दी जानी चाहिए) का उपयोग करना प्राप्त करना काफी आसान है। आप उपनिर्देशिका को बाहर करने के लिए या तो .dockerignore फ़ाइल का उपयोग कर सकते हैं, या आप COPY सभी फ़ाइलों को उपनिर्देशिका को हटाने के लिए RUN rm bla कर सकते हैं।

याद रखें कि COPY या ADD के साथ छवि में जो भी फाइलें आप जोड़ते हैं, निर्माण संदर्भ के अंदर होना चाहिए यानी docker build से चलने वाली निर्देशिका में या नीचे।

+1

हर दिन कुछ नया सीखें :-) कॉप और बिल्ड संदर्भ से कार्य जोड़ें (मेजबान नहीं)। सबफ़ोल्डर को मुखौटा करने के लिए वॉल्यूम का उपयोग करना संभव होगा? ओपी/होस्टफोल्डर (मुझे लगता है) को माउंट करना चाहता है, और/होस्ट/फ़ोल्डर्स/उपफोल्डर डिस्कनेक्ट हो गया है। यदि प्रत्येक के लिए वॉल्यूम था, लेकिन केवल होस्टफोल्डर 'माउंट' (-v) था, तो क्या वह कंटेनर में सबफ़ोल्डर परिवर्तन को अलग करेगा? – Greg

+0

मुझे यकीन नहीं है, मैंने कभी भी घोंसला घूमने की कोशिश नहीं की है। मुझे विश्वास नहीं है कि यह एक अच्छा विचार है, लेकिन मुझे इसे देखना होगा। –

+1

मुझे उप-निर्देशिका (या यहां तक ​​कि एक निर्देशिका) को बाहर करने के लिए '.dockerignore' फ़ाइल में क्या रखना है, इसके अलावा कहीं भी एक उदाहरण नहीं मिल रहा है। यह देखते हुए कि फ़ाइल का उल्लिखित उद्देश्य है, यह काफी विषम है। –

131

का उपयोग डोकर-लिखें मैं स्थानीय स्तर पर node_modules उपयोग करने के लिए है, लेकिन docker-compose.yml

volumes: 
    - './angularApp:/opt/app' 
    - /opt/app/node_modules/ 

तो ./angularApp में सब कुछ /opt/app को मैप किया है में निम्न सिंटैक्स का उपयोग कर डोकर कंटेनर में इसे अनदेखा कर सकती हूं और फिर मैं बनाने एक और माउंट वॉल्यूम /opt/app/node_modules/ जो अब खाली निर्देशिका है - भले ही मेरी स्थानीय मशीन ./angularApp/node_modules खाली न हो।

+28

आप सर एक सज्जन और विद्वान हैं। प्रतिभाशाली! –

+1

@ रिचर्डक्लेटन प्रशंसा के लिए धन्यवाद :-) – kernix

+0

@ केमिक्स - प्रतिभा! –

5

एक फ़ाइल को बाहर करने के लिए निम्न

volumes: 
    - /hostFolder:/folder 
    - /dev/null:/folder/fileToBeExcluded 
+1

मुझे जो चाहिए उसके लिए बिल्कुल सही समाधान (मेजबान तक node_modules को मानचित्र न करें क्योंकि विंडोज होस्ट पर symlink सामान टूट गया)। पॉइंटिंग/dev/null काम नहीं कर सका, लेकिन एक रिक्त निर्देशिका बनाना और इसे मैप करने के लिए पूरी तरह से काम किया और मेरे द्वारा किए गए मुद्दों को हल किया - इस विचार के लिए धन्यवाद। –

संबंधित मुद्दे