मौजूदा उत्तर इस प्रश्न को देखने वाले किसी भी व्यक्ति को सबसे अधिक कवर करते हैं। तो मैं सिर्फ CMD और RUN के लिए कुछ आला क्षेत्रों को कवर करूंगा।
CMD: डुप्लिकेट्स अनुमत हैं लेकिन व्यर्थ हैं
जिंजरब्रेड एक महत्वपूर्ण बिंदु बनाता है: यदि आप एक से अधिक सीएमडी में रखते हैं तो आपको कोई त्रुटि नहीं मिलेगी - लेकिन ऐसा करना बेकार है। मैं एक उदाहरण के साथ विस्तार करना चाहता हूं:
FROM busybox
CMD echo "Executing CMD"
CMD echo "Executing CMD 2"
यदि आप इसे एक छवि में बनाते हैं और इस छवि में एक कंटेनर चलाते हैं, तो जैसा कि जिंजरबेयर बताता है, केवल अंतिम सीएमडी को ध्यान में रखा जाएगा। तो उस कंटेनर का आउटपुट होगा:
निष्पादित सीएमडी 2
जिस तरह से मुझे लगता है कि यह है कि "सीएमडी" पूरी छवि के लिए एक एकल वैश्विक चर स्थापित कर रहा है, इसलिए क्रमिक "सीएमडी" कथन किसी भी पिछले को उस वैश्विक चर को लिखते हैं, और अंतिम छवि में जो बनाया गया है। पिछले एक जीत लिखने के लिए। चूँकि एक डॉकरीफाइल ऊपर से नीचे तक के क्रम में निष्पादित होता है, हम जानते हैं कि सबसे नीचे का सीएमडी है जो इस अंतिम "राइट" (रूपक से बोलना) को प्राप्त करता है।
RUN: इमेजेज कैश्ड हैं तो कमांड एक्सेक्यूट नहीं कर सकते
RUN के बारे में नोटिस करने के लिए एक सूक्ष्म बिंदु यह है कि यह एक शुद्ध कार्य के रूप में माना जाता है, भले ही साइड-इफेक्ट्स हों, और इस प्रकार कैश किया गया हो। इसका मतलब यह है कि अगर RUN के कुछ साइड इफेक्ट्स हैं जो परिणामी छवि को नहीं बदलते हैं, और उस छवि को पहले ही कैश कर दिया गया है, तो RUN को फिर से निष्पादित नहीं किया जाएगा और इसलिए साइड इफेक्ट बाद के बिल्ड पर नहीं होंगे। उदाहरण के लिए, इस डॉकरीफाइल को लें:
FROM busybox
RUN echo "Just echo while you work"
पहली बार इसे चलाने पर, आपको अलग-अलग अल्फ़ान्यूमेरिक आईडी के साथ इस तरह का आउटपुट मिलेगा:
docker build -t example/run-echo .
Sending build context to Docker daemon 9.216kB
Step 1/2 : FROM busybox
---> be5888e67be6
Step 2/2 : RUN echo "Just echo while you work"
---> Running in ed37d558c505
Just echo while you work
Removing intermediate container ed37d558c505
---> 6f46f7a393d8
Successfully built 6f46f7a393d8
Successfully tagged example/run-echo:latest
ध्यान दें कि उपरोक्त में इको स्टेटमेंट निष्पादित किया गया था। दूसरी बार जब आप इसे चलाते हैं, तो यह कैश का उपयोग करता है, और आपको बिल्ड के आउटपुट में कोई प्रतिध्वनि दिखाई नहीं देगी:
docker build -t example/run-echo .
Sending build context to Docker daemon 9.216kB
Step 1/2 : FROM busybox
---> be5888e67be6
Step 2/2 : RUN echo "Just echo while you work"
---> Using cache
---> 6f46f7a393d8
Successfully built 6f46f7a393d8
Successfully tagged example/run-echo:latest