डॉकर में एक वॉल्यूम जोड़ें, लेकिन एक उप-फ़ोल्डर को बाहर करें


209

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

अब तक सब ठीक है।

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

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

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


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

1
@ कानो यह एक टिप्पणी है, जवाब नहीं।
अभिजीत सरकार

जवाबों:


396

डॉकटर-कम्पोज़ का उपयोग करके मैं स्थानीय रूप से नोड_मॉड्यूल का उपयोग करने में सक्षम हूं, लेकिन निम्न सिंटैक्स का उपयोग करके डॉकटर कंटेनर में इसे अनदेखा करें docker-compose.yml

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

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


3
यह काम करता है लेकिन मैं कंटेनर के अंदर इन dirs को नहीं हटा सकता। उदाहरण के लिए: मुझे /opt/app/node_modules/उसी नाम के साथ किसी अन्य निर्देशिका को बदलने की आवश्यकता है । त्रुटि होती है: 'वॉल्यूम व्यस्त'
Stepan Yudin

32
अनुगामी स्लेश मत भूलना! जैसे। / ऑप्ट / ऐप / नोड_मॉड्यूल काम नहीं करता है, यह अधिलेखित हो जाएगा ।/angularApp/node_modules
स्टिंगस

3
यह ट्रिक मेरे लिए काम करती थी, लेकिन सेल्फ-कंपोज फाइल के लिए भी अब ऐसा नहीं लगता। जिज्ञासु अगर यह दूसरों के लिए भी काम करना बंद कर दे।
प्लिहान

8
धन्यवाद! आपने मेरा दिन बचाया! साधारण डॉकटर का उपयोग करने के मामले में, ऐसा नहीं लगता कि यह ऐसा होगा: -v $(pwd):/build/ -v /build/node_modules
बोगडान मार्ट

3
मुझे दस्तावेज़ मिला, docs.docker.com/storage/volumes/…If you start a container which creates a new volume, as above, and the container has files or directories in the directory to be mounted (such as /app/ above), the directory’s contents are copied into the volume.
हिरोशी

118

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

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

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


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

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

3
मामले में किसी को यह समझने में दिलचस्पी है कि डॉक कंटेनर में node_modules:नामित वॉल्यूम "इग्नोर" का उपयोग क्यों किया /app/node_modulesजाता है, तो यह पोस्ट उपयोगी हो सकती है कि डॉक कैसे कई माउंट प्रकारों को संभालता है?
इरा

3
मुझे नहीं पता कि मैं कुछ गलत कर रहा हूं, लेकिन अगर मैं ऐसा करता हूं, तो कंटेनर शुरू करें और फिर HOST मशीन पर npm इंस्टॉल करें, यह CONTAINER के अंदर नोड_मॉडल भी बदलता है। मैं सोच भी नहीं सकता कि कोई ऐसा क्यों करना चाहेगा, लेकिन फिर भी मैं एक क्लीनर सेपरेशन की तलाश में हूं।
रेना

3
@ रेनेरा में भी यही मुद्दा था, मेरी होस्ट मशीन लगातार नोड_मॉडल पर लिखती थी, भले ही मेरा नाम मात्रा था ... सभी प्रकार की असंगति के कारण। इसे ठीक करने पर दिया और पूरे रेपो के बजाय केवल मेरे src फ़ोल्डर की नकल करके इसके चारों ओर काम किया
dancypants

19

किसी फ़ाइल को बाहर करने के लिए, निम्नलिखित का उपयोग करें

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

6
जो मुझे चाहिए उसके लिए सही समाधान (होस्ट के लिए नोड_मॉडल को मैप नहीं करने के लिए क्योंकि विंडोज़ के होस्ट पर सीलिंक का सामान टूट गया)। / देव / अशक्त की ओर इशारा करते हुए काम नहीं किया, लेकिन एक रिक्त निर्देशिका बनाने और उस पर मैप करने से पूरी तरह से काम किया और उन मुद्दों को हल किया जो मेरे पास थे - इस विचार के लिए धन्यवाद।
लियाम हैममेट 14

1
यह मैक 18.09.0 के लिए डॉकर में काम नहीं करता है Cannot start service xxx: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: mounting \\\"/dev/null\\\" to rootfs \\\"/var/lib/docker/overlay2/d15ed56ad020d408c63a1f6a6365dbb88d5d3b78a4605980d3faa9861102ef21/merged\\\" at [...] unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type:। अनुगामी स्लैश जोड़ने से कोई मदद नहीं मिली।
ब्‍लॉइस

मैं इस बात की पुष्टि कर सकता हूं कि यह डॉकर 18.09.3 के साथ उबंटू 16.04 पर काम नहीं करता है।
डिर्क

यह मेरे लिए काम नहीं करता है। यह सब /dev/nullकुछ एक डिवाइस फ़ाइल के रूप में कंटेनर में कॉपी होता है ।
रेडॉन रोसबोरो

1
कृपया नोट करें कि यह कार्य केवल FILES को छोड़कर है! / dev / बातिल एक फाइल है और इतने लक्ष्य होना चाहिए, त्रुटि संदेश इस पर काफी स्पष्ट है: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type। यह वही नहीं है जो ओपी देख रहा था, लेकिन यह मेरे लिए बहुत उपयोगी था, क्योंकि मुझे एक एकल फ़ाइल को बाहर करने की आवश्यकता थी।
15

13

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

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

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

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


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

मुझे यकीन नहीं है, मैंने कभी भी नेस्टिंग वॉल्यूम की कोशिश नहीं की है। मुझे यकीन नहीं है कि यह एक अच्छा विचार है, लेकिन मुझे इस पर गौर करना होगा।
एड्रियन मौट

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

1
एक बार जब आप किसी भी फाइल को जोड़ते हैं, तब भी वे कुछ परतों में समाप्त हो जाती हैं। इसलिए उनमें से एक हटाने से आपको उन्हें छिपाने में मदद नहीं मिलेगी यदि सुरक्षा संवेदनशील है या छवि का आकार कम करती है (क्योंकि वे अंतर्निहित परतों में होंगे)। squashपरतों के विकल्प हैं । एक है github.com/goldmann/docker-squash और दूसरा है oc ex dockerbuildओपनशिफ्ट प्रोजेक्ट से इस्तेमाल ।
अकोस्टैडिनोव

6

लगता है कि पुराने समाधान अब काम नहीं करते (कम से कम मेरे लिए)। एक खाली फ़ोल्डर बनाने और इसे करने के लिए लक्ष्य फ़ोल्डर मैपिंग हालांकि मदद की।

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

मेरे साथ या तो काम नहीं करता है docker-compose 1.25.0-rc3, सिंटैक्स v3 फ़ाइल करें।
itismydesign

6

Docker कमांड लाइन के साथ:

docker run \
    --mount type=bind,src=/hostFolder,dst=/containerFolder \
    --mount type=volume,dst=/containerFolder/subFolder \
    ...other-args...

-vविकल्प भी इस्तेमाल किया जा सकता (करने के लिए क्रेडिट Bogdan मार्ट ), लेकिन --mountस्पष्ट और है की सिफारिश की


6

उन लोगों के लिए भी जिनके पास यह समस्या थी कि नोड_मॉडल फ़ोल्डर अभी भी आपके स्थानीय सिस्टम और अन्य तरीके से अधिलेखित होगा

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

यह समाधान है, /नोड_मॉडल के ठीक होने के बाद पीछे चल रहा है।


0

अपनी मशीन की मात्रा में निहित एक माउंटेड फ़ाइल को बाहर करने के लिए, आपको इसे उसी फ़ाइल में वॉल्यूम आवंटित करके इसे अधिलेखित करना होगा। आपकी कॉन्फ़िग फ़ाइल में:

services:
  server:
    build : ./Dockerfile
    volumes:
      - .:/app

आप में एक उदाहरण dockerfile:

# Image Location
FROM node:13.12.0-buster
VOLUME /app/you_overwrite_file
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.