डॉकर ADD बनाम VOLUME


116

मैं डॉकर सीख रहा हूं और मुझे संदेह है कि कब और कहां उपयोग करना है ADDऔर VOLUME। यहाँ मुझे लगता है कि ये दोनों करते हैं:

जोड़ें

बिल्ड समय में छवि पर फ़ाइलों की प्रतिलिपि बनाएँ। छवि में सभी फाइलें हैं ताकि आप बहुत आसानी से तैनात कर सकें। दूसरी ओर, हर बार निर्माण करने की आवश्यकता विकास में एक अच्छे विचार की तरह नहीं दिखती है क्योंकि भवन को डेवलपर को कंटेनर के पुनर्निर्माण के लिए कमांड चलाने की आवश्यकता होती है; इसके अतिरिक्त, कंटेनर का निर्माण समय लेने वाला हो सकता है।

मात्रा

मैं समझता हूं कि docker run -vआप अपने कंटेनर के अंदर एक होस्ट फ़ोल्डर को माउंट कर सकते हैं, इस तरह आप आसानी से फ़ाइलों को संशोधित कर सकते हैं और अपने कंटेनर में ऐप को देख सकते हैं जो परिवर्तनों पर प्रतिक्रिया करते हैं। यह विकास में बहुत अच्छा लग रहा है, लेकिन मुझे यकीन नहीं है कि इस तरह से मेरी फ़ाइलों को कैसे तैनात किया जाए।


3
सामान्य तौर पर, यह पसंद करना सबसे अच्छा COPYहै ADD। वे लगभग समान हैं, लेकिन ADDकुछ अतिरिक्त योग्यताएं हैं wrt URL और संग्रह फाइलें जो आश्चर्यचकित कर सकती हैं।
एड्रियन मौट

2
@jamesmstone - उस लिंक (और आधिकारिक docker डॉक्स) की सलाह देते हैं - ADD के बजाय COPY का उपयोग करें।
सॉफ्टवेयर इंजीनियर

उफ़, तुम सही हो - चीयर्स!
jamesmstone

जवाबों:


183

जोड़ें

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

उन मामलों के कुछ उदाहरण जहां आप उपयोग करना चाहते हैं ADD:

  • आप आवश्यकताओं में कुछ आवश्यकताएं हैं। एक फ़ाइल जिसे आप अपने डॉकरफाइल में संदर्भित और स्थापित करना चाहते हैं। आप तब कर सकते हैं: ADD ./requirements.txt /requirements.txtइसके बादRUN pip install -r /requirements.txt
  • आप उदाहरण के लिए, अपने ऐप कोड को अपने डॉकरीफ़ाइल में संदर्भ के रूप में उपयोग करना चाहते हैं, यदि आप अपनी छवि में काम करने वाले डायर के रूप में अपनी ऐप डायरेक्टरी को सेट करना चाहते हैं और आपकी छवि से चलने वाले कंटेनर में डिफ़ॉल्ट कमांड वास्तव में आपके ऐप को चलाते हैं, तो आप क्या कर सकते हैं:

    ADD ./ /usr/local/git/my_app

    WORKDIR /usr/local/git/my_app

    CMD python ./main.py

मात्रा

दूसरी ओर वॉल्यूम, बस आपकी छवि से एक कंटेनर को चलाने की अनुमति देता है, जिस भी स्थानीय मशीन पर कंटेनर चलाया जा रहा है, उस पर किसी न किसी रास्ते पर पहुंच सकता है। आप अपनी VOLUMEनिर्देशिका से अपनी Dockerfile में फ़ाइलों का उपयोग नहीं कर सकते । आपके वॉल्यूम निर्देशिका में कुछ भी बिल्ड-टाइम पर पहुंच योग्य नहीं होगा, लेकिन रन-टाइम पर पहुंच योग्य होगा

उन मामलों के कुछ उदाहरण जहां आप उपयोग करना चाहते हैं VOLUME:

  • आपके कंटेनर में चलाया जा रहा ऐप लॉग इन करता है /var/log/my_app। आप चाहते हैं कि उन लॉग को होस्ट मशीन पर पहुँचा जा सके और कंटेनर हटाए जाने पर हटाया नहीं जा सके। आप अपने Dockerfile में /var/log/my_appजोड़कर एक माउंट पॉइंट VOLUME /var/log/my_appबनाकर और फिर अपने कंटेनर को चलाकर ऐसा कर सकते हैंdocker run -v /host/log/dir/my_app:/var/log/my_app some_repo/some_image:some_tag
  • आपके पास कुछ स्थानीय सेटिंग्स फ़ाइलें हैं जिनके लिए आप चाहते हैं कि कंटेनर में ऐप है। शायद उन सेटिंग्स फ़ाइल आपके स्थानीय मशीन बनाम देव बनाम उत्पादन पर अलग हैं। विशेष रूप से इसलिए यदि वे सेटिंग्स फ़ाइलें गुप्त हैं, तो निश्चित रूप से आप अपनी छवि में उन्हें नहीं चाहते हैं । उस मामले में एक अच्छी रणनीति यह है कि VOLUME /etc/settings/my_app_settingsअपने डॉकरफाइल में जोड़ें , अपने कंटेनर को चलाएं docker run -v /host/settings/dir:/etc/settings/my_app_settings some_repo/some_image:some_tag, और सुनिश्चित करें कि आपके एप्लिकेशन को चलाने के लिए आपके द्वारा अपेक्षित सभी वातावरण में / होस्ट / सेटिंग्स / डीआईआर मौजूद हैं।

13
अब तक मुझे सबसे ज्यादा उपयोगी पोस्ट ADD और VOLUME
जसमीत

5
यदि VOLUME निर्दिष्ट किया जाता है तो क्या होता है, फिर भी डॉक रन के दौरान प्रदान नहीं किया जाता है (जैसे -v xxx पैरामीटर गायब है)? सम्मान है। फिर प्रभावी रूप से क्षणिक हो रहा है?
col.panic

डॉकरफाइल के अंदर, वॉल्यूम का मतलब केवल दृढ़ता और / या डिबगिंग के लिए होता है, लेकिन आप किसी मौजूदा छवि (कोई डॉकरीफाइल की जरूरत नहीं) में एक ऐप प्राप्त करने के लिए वॉल्यूम कमांड लाइन स्विच का उपयोग कर सकते हैं और इसे इस तरह से चला सकते हैं docker run -v $HOST_PATH:$CONTAINER_PATH node:latest node $CONTAINER_PATH/app.js
चिनोटो वोक्रो

अच्छा "परत" विस्तार
स्ट्रैटोवेरियस

27

VOLUMEअनुदेश रनटाइम पर अपने डोकर कंटेनर में एक डेटा मात्रा पैदा करता है। एक तर्क के रूप में प्रदान की गई VOLUMEनिर्देशिका एक निर्देशिका है जो यूनियन फाइल सिस्टम को बायपास करती है , और मुख्य रूप से निरंतर और साझा डेटा के लिए उपयोग की जाती है।

यदि आप चलाते हैं docker inspect <your-container>, तो आप उस Mountsअनुभाग के नीचे देखेंगे Sourceजो होस्ट पर निर्देशिका स्थान का प्रतिनिधित्व करता है, और Destinationजो कंटेनर में घुड़सवार निर्देशिका स्थान का प्रतिनिधित्व करता है। उदाहरण के लिए,

"Mounts": [
  {
    "Name": "fac362...80535",
    "Source": "/var/lib/docker/volumes/fac362...80535/_data",
    "Destination": "/webapp",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
  }
]

यहाँ 3 उपयोग के मामले हैं docker run -v:

  1. docker run -v /data: यह VOLUMEआपके डॉकरफाइल में निर्देश को निर्दिष्ट करने के लिए अनुरूप है ।
  2. docker run -v $host_path:$container_path: यह आपको रनटाइम के दौरान अपने कंटेनर में अपने $host_pathहोस्ट से माउंट करने की अनुमति देता $container_pathहै। विकास में, यह कंटेनर के साथ अपने होस्ट पर स्रोत कोड साझा करने के लिए उपयोगी है। उत्पादन में, इसका उपयोग होस्ट की DNS जानकारी (जैसे पाया जाता है /etc/resolv.conf) या रहस्यों को कंटेनर में रखने के लिए किया जा सकता है। इसके विपरीत, आप इस तकनीक का उपयोग होस्ट पर विशिष्ट फ़ोल्डरों में कंटेनर के लॉग को लिखने के लिए भी कर सकते हैं। दोनों $host_pathऔर $container_pathपूर्ण मार्ग होने चाहिए।
  3. docker run -v my_volume:$container_path: यह आपके कंटेनर में एक डेटा वॉल्यूम बनाता है $container_pathऔर इसे नाम देता है my_volume। यह अनिवार्य रूप से उपयोग करने वाले वॉल्यूम को बनाने और नाम देने के समान है docker volume create my_volume। इस तरह एक वॉल्यूम का नामकरण कंटेनर डेटा वॉल्यूम और एक साझा-स्टोरेज वॉल्यूम के लिए उपयोगी है जो फ्लोकर जैसे मल्टी-होस्ट स्टोरेज ड्राइवर का उपयोग करता है ।

ध्यान दें कि डेटा वॉल्यूम के रूप में होस्ट फ़ोल्डर को माउंट करने का दृष्टिकोण डॉकरफाइल में उपलब्ध नहीं है। कर्ता दस्तावेज उद्धृत करने के लिए ,

नोट: यह पोर्टेबिलिटी और शेयरिंग उद्देश्य के कारण डॉकफाइल से उपलब्ध नहीं है। मेज़बान निर्देशिका के रूप में, इसकी प्रकृति, मेज़बान-निर्भर, डॉकफ़िले में निर्दिष्ट एक मेज़बान निर्देशिका शायद सभी मेजबानों पर काम नहीं करेगी।

अब यदि आप अपनी फ़ाइलों को गैर-विकास के वातावरण में कंटेनरों में कॉपी करना चाहते हैं, तो आप अपने डॉकरफाइल में ADDया COPYनिर्देशों का उपयोग कर सकते हैं । ये वे हैं जो मैं आमतौर पर गैर-विकास तैनाती के लिए उपयोग करता हूं।


3
क्या मुझे 2 डॉक फाइलें बनानी चाहिए? एक विकास के लिए और एक तैनाती के लिए?
क्रिस्टियन गार्सिया

मुझे ऐसा नहीं लगता। ADDआपके Dockerfile में निर्देश होने में कुछ भी गलत नहीं है , क्योंकि यह केवल docker buildकमांड द्वारा निष्पादित होता है । इसकी आवश्यकता तब होती है जब अन्य लोग आपके कंटेनर को पहली बार बनाते हैं, और जब आप इसे अन्य गैर-विकास वातावरण में तैनात करने के लिए तैयार होते हैं।
ivan.sim

3
लेकिन क्या यह फाइलों के बिना एक छवि बनाने और -vविकास के लिए कमांड का उपयोग करने के लिए अधिक कुशल नहीं होगा , और क्या एक अन्य डॉक फाइल में एक छवि बनाई गई है जिसमें ADDतैनाती के लिए फाइलें शामिल हैं ?
क्रिस्टियन गार्सिया

1
यह एक व्यापार बंद है जिसे आपको तय करना है। आप के लिए क्या काम करता है उठाओ। ADDवैसे भी बिल्ड कितनी देर तक लेता है? कुल में युगल सेकंड? यदि आपके पास दो डॉकरीफ़ाइल फ़ाइलें हैं, और आप इसे दूसरों के साथ साझा करते हैं (या docker रजिस्ट्री पर प्रकाशित करते हैं ), तो कौन सा डिफ़ॉल्ट है? सही उपयोगकर्ताओं के लिए सही डिफ़ॉल्ट Dockerfile को सुनिश्चित करने के लिए आपके पास कुछ अतिरिक्त रखरखाव होगा। लेकिन दिन के अंत में, आप तय करते हैं कि आपके लिए सबसे अच्छा क्या है। व्यक्तिगत रूप से, मैं यह सुनिश्चित करना पसंद करता हूं कि मेरे कंटेनर के निर्माण के लिए एक और केवल एक डॉकरीफाइल है।
ivan.sim

11
वैसे मुझे लगता है कि यह पहले ADD के लिए ठीक है, फिर ओवरराइड करें जो विकास के लिए -v को जोड़ता है। इस तरह आपको अलग डॉकरीफाइल्स की आवश्यकता नहीं होगी।
अत्तिला सेसेरेमी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.