डॉकरफाइल में वीओएलएमई का उद्देश्य क्या है


106

मैं डोकर की मात्रा के बारे में अपनी समझ में गहराई तक जाने की कोशिश कर रहा हूं, और मुझे मतभेद / उपयोग-मामले का पता लगाने के लिए एक कठिन समय आ रहा है:

  • docker volume createआदेश
  • docker run -v /path:/host_path
  • VOLUMEमें प्रवेश Dockerfileफ़ाइल

मुझे विशेष रूप से समझ में नहीं आता कि यदि आप ध्वज के VOLUMEसाथ प्रविष्टि को जोड़ते हैं तो क्या होता है -v


जवाबों:


70

एक वॉल्यूम एक स्थिर डेटा है जिसमें संग्रहीत किया जाता है /var/lib/docker/volumes/...

  • आप या तो इसे डॉकरफाइल में घोषित कर सकते हैं, जिसका अर्थ है कि प्रत्येक बार जब छवि से एक कंटेनर शुरू होता है, तो वॉल्यूम बनाया जाता है ( खाली ), भले ही आपके पास कोई -vविकल्प न हो ।

  • आप इसे रनटाइम पर घोषित कर सकते हैं docker run -v [host-dir:]container-dir
    दो ( VOLUME+ docker run -v) को संयोजित करने का अर्थ है कि आप एक होस्ट फ़ोल्डर की सामग्री को अपने कंटेनर में बनाए हुए वॉल्यूम में माउंट कर सकते हैं/var/lib/docker/volumes/...

  • डॉकर वॉल्यूम क्रिएट करता है बिना डॉकफाइल को परिभाषित किए एक वॉल्यूम बनाता है और एक इमेज का निर्माण करता है और एक कंटेनर चलाता है। इसका उपयोग अन्य कंटेनरों को जल्दी से उक्त मात्रा को माउंट करने के लिए किया जाता है।

यदि आपने एक वॉल्यूम में कुछ सामग्री को बनाए रखा था, लेकिन तब से कंटेनर को हटा दिया गया (जो डिफ़ॉल्ट रूप से इसकी संबद्ध मात्रा को नहीं हटाता है, जब तक कि आप docker rm -v का उपयोग नहीं कर रहे हैं), आप एक नए कंटेनर में उक्त मात्रा फिर से संलग्न कर सकते हैं (घोषित करना वही आयतन)।

" डॉकर - एक कंटेनर से जुड़ी नहीं मात्रा का उपयोग कैसे करें? " देखें।
डॉक वॉल्यूम बनाने के साथ, एक कंटेनर में एक नामित वॉल्यूम को फिर से जोड़ना आसान है।

docker volume create --name aname
docker run -v aname:/apath --name acontainer
...
# modify data in /apath
...
docker rm acontainer

# let's mount aname volume again
docker run -v aname:/apath --name acontainer
ls /apath
# you find your data back!

2
चलो आप एक का प्रयोग करते हैं Dockerfileसाथ VOLUMEऔर -v /path:/host_path/झंडा। की सामग्री VOLUMEद्वारा वसीयत की गई सामग्री को ओवरराइड किया जाएगा /host_path/?
रेडियम 226

@VonC के लिए धन्यवाद, मुझे लगता है कि मुझे यह मिल गया है :) और यदि आप एक docker volume create --name my_volumeद्वारा पीछा docker run --volume-from my_volumeकरते हैं, तो आपको कैसे पता चलेगा कि माउंटपॉइंट कहां होगा?
रेडियम 226

@ radium226 कोई आरोह बिंदु (जिसका अर्थ है मेजबान से घुड़सवार, देशी खाली / var / lib / docker / मात्रा के बगल में)। वॉल्यूम का पथ my_volume मेटाडेटा में है: stackoverflow.com/a/31997267/6309
VonC

मैं समझता हूं कि मेजबान की ओर से कोई संकेत नहीं है। लेकिन साथ चल रहे कंटेनर के भीतर docker run ..., मैं my_volumeवॉल्यूम पर संग्रहीत फ़ाइल में कैसे लिख सकता हूं ? मुझे नहीं पता ... रास्ता? मेरे चल रहे कंटेनर के अंदर वॉल्यूम की वजह से मैंने कुछ भी नहीं परिभाषित किया? मुझे आशा है कि मैं पर्याप्त स्पष्ट हूं, क्योंकि मैं निश्चित रूप से अपने
व्यवहार्य के बारे में

1
@ radium226 docker volume create --name anameएक नामित वॉल्यूम बनाता है : आप रनटाइम पर एक कंटेनर पथ असाइन करते हैं docker run -v aname:/apath:: उस कंटेनर में अब इसके साथ एक वॉल्यूम जुड़ा हुआ है, जो इसके / एपथ फ़ोल्डर पर मुहिम करता है। मैंने यह स्पष्ट करने के लिए उत्तर को फिर से लिखा है।
VonC

11

VOLUMEनिर्देश दिलचस्प हो जाता है जब आप इसे volumes-fromरनटाइम पैरामीटर के साथ जोड़ते हैं ।

निम्नलिखित Dockerfile को देखते हुए:

FROM busybox
VOLUME /myvolume

इसके साथ एक छवि बनाएँ:

docker build -t my-bb .

और एक कंटेनर के साथ स्पिन करें:

docker run --rm -it --name my-first-bb my-bb

नोटिस करने वाली पहली बात यह है कि इस नाम की छवि में एक फ़ोल्डर होगा myvolume। लेकिन यह विशेष रूप से दिलचस्प नहीं है क्योंकि जब हम कंटेनर से बाहर निकलते हैं तो वॉल्यूम को भी हटा दिया जाएगा।

इस फ़ोल्डर में एक खाली फ़ाइल बनाएँ, इसलिए कंटेनर में निम्नलिखित चलाएँ:

cd myvolume
touch hello.txt

अब एक नया कंटेनर स्पिन करें, लेकिन उसी मात्रा को इसके साथ साझा करें my-first-bb:

docker run --rm -it --volumes-from my-first-bb --name my-second-bb my-bb

आप देखेंगे कि फ़ोल्डर में my-second-bbफ़ाइल शामिल है ।hello.txtmyvolume

एक बार जब आप दोनों कंटेनरों से बाहर निकल जाते हैं, तो आपकी मात्रा भी हटा दी जाएगी।


वॉल्यूम हटा दिए जाएंगे क्योंकि वे अनाम वॉल्यूम हैं और आपने --rmविकल्प के साथ कंटेनर प्रारंभ किए हैं । मुझे लगता है कि यह इसका उल्लेख करने पर काम कर सकता है। यदि आपने कंटेनर चालू नहीं किया है --rm, तो भी आप कंटेनर और उसके अनाम संस्करणों को निकाल सकते हैं docker rm -v my-container
अयमेव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.