2014-04-25 6 views
6

कंटेनर शुरू होने पर एक स्क्रिप्ट निष्पादित करने के लिए छवि बनाम एक सीएमडी निर्देश सेट करने के लिए डॉकरफ़ाइल में कई रन कमांड का उपयोग करने के लिए सबसे अच्छा अभ्यास क्या है ?कंटेनर शुरू करने के लिए डॉकरफाइल में सेटअप स्क्रिप्ट निष्पादित करने के लिए एकाधिक सीएनडी बनाम एकल सीएमडी

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

FROM centos:latest 

RUN useradd myuser 
RUN mkdir -p /usr/local/myapp 
ADD ./resources/myapp.zip /usr/local/myapp 
RUN unzip /usr/local/myapp/myapp.zip 
RUN chown -R myuser:myuser /usr/local/myapp 

CMD ["/usr/local/myapp/bin/app"] 

बनाम

FROM centos:latest 

ADD ./resources/myapp.zip/
ADD ./resources/setup.sh/
RUN chmod +x /setup.sh 

# setup.sh will create the user, extract the zip, execute the binary 
CMD ["/setup.sh"] 

उत्तर

5

पहला उदाहरण app कई बार चलाने के लिए बेहतर होगा। यदि आप CMD के बजाय ENTRYPOINT का उपयोग करना चाहते थे तो आप कंटेनर व्यवहार कर सकते हैं जैसे कि यह app था (क्योंकि यह app चलाएगा जो आपने कमांडलाइन पर तर्क के रूप में पारित किया था)। यदि आप बाद में इस छवि का उपयोग किसी अन्य छवि के आधार के रूप में करना चाहते थे, तो आप अभी भी app तक पहुंच सकते हैं।

दूसरे उदाहरण कुछ धीमा चलाने के बाद से यह ज़िप फ़ाइल हर बार जब आप docker run निकालने चाहिए और आप आसानी से app उपयोग नहीं कर सकते अगर आप इस एक माता पिता की छवि बनाने के लिए, के बाद से app स्थापित नहीं किया गया होगा।

सामान्य रूप से मैं पहले प्रारूप का उपयोग करने का सुझाव दूंगा, लेकिन दूसरा एक छोटा सा ज़िप और फेंकने वाली छवियों और कंटेनर के लिए ठीक है।

+0

धन्यवाद! मैंने इस तथ्य को नहीं माना था कि जब भी आप छवि से एक कंटेनर शुरू करते हैं तो setup.sh चलाया जाएगा। मेरे मामले में - हर बार निकाले जाने के बजाय 'ऐप' छवि के हिस्से के लिए बेहतर होगा। – Owen

+0

@ ओवेन यह 'सीएमडी' का उद्देश्य है: https://docs.docker.com/engine/reference/builder/#cmd –

संबंधित मुद्दे