दिलचस्प पोस्ट
बदलने से पहले चयन (ड्रॉपडाउन) का मूल्य प्राप्त करना सी # में सीआरएल कॉल करना Inno सेटअप: कैसे स्वचालित रूप से पिछले स्थापित संस्करण की स्थापना रद्द करें? XPath परीक्षण अगर नोड मान संख्या है "टेबल से हटाएं" के बाद सॉकेट फाईल का आकार बदलें आईफोन एसडीके के साथ एक छवि आकार का आकार बदलने / अनुकूलित करने का सबसे आसान तरीका क्या है? क्या सी और सी ++ दोनों में वैध कोड हो सकता है, जब प्रत्येक भाषा में संकलित हो? ब्लॉक बनाम ब्रैकेट्स का उपयोग करना {} एक दांतेदार पथ चौरसाई 2 क्षेत्रों की तुलना करने के लिए MongoDb क्वेरी स्थिति रूबी में स्पष्ट रूप से वापसी करने के लिए क्या यह अच्छी शैली है? मैं डीजेंगो में इस दौड़ की स्थिति से कैसे निपटूं? एएसपी.नेट वेब एपीआई से एक्सएमएल में नेमस्पेस निकालें दिनांक कैसे ओरेकल में संग्रहीत हैं? सीतनिद्रा में होना hbm2ddl.auto संभव मूल्यों और वे क्या करते हैं?

डॉकरफाइल में `कॉपी 'और` एडीडी` के आदेशों के बीच अंतर क्या है?

Dockerfile में COPY और ADD कमांडों के बीच अंतर क्या है, और मैं दूसरे पर एक का उपयोग कब करेगा?


 COPY <src> <dest> 

प्रतिलिपि अनुदेश नई फाइलों को <src> से कॉपी करेगा और उन्हें पथ <dest> पर कंटेनर की फाइल सिस्टम में जोड़ देगा


 ADD <src> <dest> 

ADD निर्देश नई फाइलों को <src> से कॉपी करेगा और उन्हें पथ <dest> पर कंटेनर की फाइल सिस्टम में जोड़ देगा।

वेब के समाधान से एकत्रित समाधान "डॉकरफाइल में `कॉपी 'और` एडीडी` के आदेशों के बीच अंतर क्या है?"

आपको उनके व्यवहार के विस्तृत वर्णन के लिए ADD और COPY दस्तावेज़ देखना चाहिए, लेकिन संक्षेप में, मुख्य अंतर यह है कि COPY से अधिक कर सकते हैं COPY :

  • ADD <src> को एक URL होने की अनुमति देता है
  • यदि <src> ADD का पैरामीटर मान्यता प्राप्त संपीड़न प्रारूप में एक संग्रह है, तो इसे अनपैक किया जाएगा

ध्यान दें कि डॉकफेफाइल लिखने के लिए सर्वश्रेष्ठ प्रथाओं का उपयोग करके कॉपइ का उपयोग किया जाता है जहां ADD के जादू की आवश्यकता नहीं है। अन्यथा आप (जब से आपको इस उत्तर को देखने की keep_this_archive_intact.tar.gz थी) किसी दिन आश्चर्यचकित होने की संभावना है, जब आप keep_this_archive_intact.tar.gz को अपने कंटेनर में कॉपी करना keep_this_archive_intact.tar.gz , लेकिन इसके बजाय आप सामग्री को अपने फाइल सिस्टम पर स्प्रे करते हैं।

COPY है

'एडीडी' के समान, लेकिन बिना टार और रिमोट यूआरएल हैंडलिंग

स्रोत कोड से सीधे संदर्भ

इस बिंदु पर कुछ आधिकारिक दस्तावेज हैं: डॉकरफाइल लेखन के लिए सर्वोत्तम अभ्यास

चूंकि छवि आकार मामलों, रिमोट यूआरएल से संकुल को लाने के लिए ADD का उपयोग जोरदार हतोत्साहित किया जाता है; आपको इसके बजाय curl या wget उपयोग करना चाहिए इस तरह आप उन फ़ाइलों को हटा सकते हैं जिनको आपको अब निकालने के बाद की आवश्यकता नहीं है और आपको अपनी छवि में एक और परत जोड़ने की आवश्यकता नहीं होगी।

 RUN mkdir -p /usr/src/things \ && curl -SL http://example.com/big.tar.gz \ | tar -xJC /usr/src/things \ && make -C /usr/src/things all 

अन्य वस्तुओं (फ़ाइलें, निर्देशिका) के लिए जिन्हें ADD की रर ऑटो निष्कर्षण क्षमता की आवश्यकता नहीं है, आपको हमेशा COPY उपयोग करना चाहिए

डॉकर डॉक्स से:

जोड़ें या कॉपी करें

हालांकि जोड़ें और कॉपी कार्यात्मक रूप से समान हैं, आम तौर पर बोलते हुए, कॉपी पसंदीदा है। ऐसा इसलिए है क्योंकि यह ADD से अधिक पारदर्शी है। प्रतिलिपि केवल कंटेनर में स्थानीय फ़ाइलों की मूल प्रतिलिपि का समर्थन करती है, जबकि एडीडी में कुछ सुविधाएं हैं (जैसे स्थानीय केवल तारा निकासी और दूरस्थ यूआरएल समर्थन) जो तुरंत स्पष्ट नहीं हैं नतीजतन, एडीडी के लिए सबसे अच्छा उपयोग छवि में स्थानीय टार फाइल ऑटो-निष्कर्षण है, जैसे कि ADD rootfs.tar.xz / में

और: डॉकरफाइल लिखने के लिए सर्वोत्तम प्रथाएं

यदि आप कंटेनर में एक /usr/local को एक्सएक्स.टीआरजीजी जोड़ना चाहते हैं, तो उसे खोल देना, और फिर बेकार संकुचित पैकेज को हटा दें।

कॉपी के लिए:

 COPY resources/jdk-7u79-linux-x64.tar.gz /tmp/ RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local RUN rm /tmp/jdk-7u79-linux-x64.tar.gz 

जोड़ने के लिए:

 ADD resources/jdk-7u79-linux-x64.tar.gz /usr/local/ 

ADD स्थानीय-केवल टार निकासी का समर्थन करता है इसके अलावा, कॉपी तीन परतों का उपयोग करेगा, लेकिन ADD केवल एक परत का उपयोग करता है

डॉकर डॉक्स से: https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-or-copy

"हालांकि जोड़ें और कॉपी कार्यात्मक रूप से समान हैं, आम तौर पर बोलते हैं, कॉपी पसंद किया जाता है, क्योंकि यह ADD की तुलना में अधिक पारदर्शी है। कॉपी केवल कंटेनर में स्थानीय फ़ाइलों की मूल प्रतिलिपि का समर्थन करता है, जबकि ADD में कुछ सुविधाएं हैं (जैसे स्थानीय केवल टैक्ड निकासी और रिमोट यूआरएल समर्थन) जो तत्काल स्पष्ट नहीं हैं। नतीजतन, एडीडी के लिए सबसे अच्छा उपयोग छवि में स्थानीय टायर फ़ाइल ऑटो-निष्कर्षण है, जैसे कि ADD rootfs.tar.xz / में

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

उदाहरण के लिए:

  COPY requirements.txt /tmp/ RUN pip install --requirement /tmp/requirements.txt COPY . /tmp/ 

यदि आपने प्रतिलिपि डाल दिया है, तो RUN चरण के लिए कम कैश अक्षम होने में परिणाम। / tmp / इससे पहले

चूंकि छवि आकार मामलों, रिमोट यूआरएल से संकुल को लाने के लिए ADD का उपयोग जोरदार हतोत्साहित किया जाता है; आपको इसके बजाय curl या wget का उपयोग करना चाहिए इस तरह आप उन फ़ाइलों को हटा सकते हैं जिनको आपको अब निकालने के बाद की आवश्यकता नहीं है और आपको अपनी छवि में एक और परत जोड़ने की आवश्यकता नहीं होगी। उदाहरण के लिए, आपको ये काम करने से बचना चाहिए:

  ADD http://example.com/big.tar.xz /usr/src/things/ RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things RUN make -C /usr/src/things all 

और इसके बजाय, ऐसा कुछ करें:

  RUN mkdir -p /usr/src/things \ && curl -SL htt,p://example.com/big.tar.xz \ | tar -xJC /usr/src/things \ && make -C /usr/src/things all 

अन्य वस्तुओं (फाइलें, निर्देशिका) के लिए जिसे ADD की टार्ट ऑटो-निष्कर्षण क्षमता की आवश्यकता नहीं है, आपको हमेशा सीओपीवाई का उपयोग करना चाहिए। "

अधिकांश मामलों में COPY काम करेगा

ADD में COPY की सभी क्षमताओं हैं और निम्नलिखित अतिरिक्त विशेषताएं हैं:

छवि में टार फ़ाइल ऑटो-निष्कर्षण की अनुमति देता है , उदाहरण के लिए,

 ADD app.tar.gz /opt/var/myapp. 

फ़ाइलों को दूरस्थ URL से डाउनलोड करने की अनुमति देता है हालांकि, डाउनलोड की गईं फ़ाइलें छवि का हिस्सा बनेंगी इससे छवि का आकार ब्लोट के कारण होता है तो यह संग्रह को स्पष्ट रूप से डाउनलोड करने, निकालने और निकालने के लिए cURL या Wget का उपयोग करने के लिए अनुशंसित है

 docker build -t {image name} -v {host directory}:{temp build directory} . 

यह एक छवि में फाइल कॉपी करने का एक और तरीका है -v विकल्प अस्थायी रूप से एक वॉल्यूम बनाता है जिसे हमने बिल्ड प्रक्रिया के दौरान उपयोग किया था।

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

इसके अलावा, कर्ल और wget की तरह, यह कमांड स्टैक (एक कंटेनर में चलाता है) में चलाया जा सकता है और छवि का आकार बढ़ाना नहीं है। जोड़ें और कॉपी स्थिर नहीं हैं क्योंकि वे एक स्टैंडअलोन कंटेनर में चलते हैं और उन फाइलों पर बाद के आदेश जो अतिरिक्त कंटेनरों में निष्पादित करते हैं, वे छवि आकार गुणा करेंगे:

विकल्पों के साथ इस प्रकार सेट करें:

 -v /opt/mysql-staging:/tvol 

निम्नलिखित एक कंटेनर में निष्पादित होगा:

 RUN cp -r /tvol/mysql-5.7.15-linux-glibc2.5-x86_64 /u1 && \ mv /u1/mysql-5.7.15-linux-glibc2.5-x86_64 /u1/mysql && \ mkdir /u1/mysql/mysql-files && \ mkdir /u1/mysql/innodb && \ mkdir /u1/mysql/innodb/libdata && \ mkdir /u1/mysql/innodb/innologs && \ mkdir /u1/mysql/tmp && \ chmod 750 /u1/mysql/mysql-files && \ chown -R mysql /u1/mysql && \ chgrp -R mysql /u1/mysql 

महत्वपूर्ण लेख

मुझे मेरे डॉकर छवि में जावा पैकेज की प्रतिलिपि बनाना और अबाउट करना था। जब मैं एडीडी का उपयोग कर बनाई गई डॉकर इमेज साइज की तुलना करते हैं तो यह 180 एमबी बड़ा था, तो सीपीआई, टीआर-एक्सज़एफ *। Tar.gz और आरएम *। Tar.gz

इसका मतलब यह है कि यद्यपि ADD तारा फ़ाइल को निकालता है, यह अभी भी कहीं भी रखा जाता है और इसकी छवि बड़ी बना रही है !!