की json वाक्य रचना CMD
(और RUN
और ENTRYPOINT
) एक कार्यकारी syscall के रूप में सीधे कर्नेल में तर्क गुजरती हैं। निष्पादन स्थल में कमांड, अलगाव, उद्धरणों से बचना, IO पुनर्निर्देशन, परिवर्तनशील प्रतिस्थापन, कमांड के बीच पाइपिंग, कई कमांड चलाना, आदि। Syscall केवल निष्पादन योग्य को चलाने के लिए ले जाता है और उस निष्पादन योग्य को पास करने के लिए तर्कों की सूची बनाता है, और इसे चलाता है।
वर्ण $
चर का विस्तार करना, ;
कमांड को अलग करना,
(स्पेस) को अलग-अलग तर्क देना, &&
और ||
चेन कमांड को, >
आउटपुट पुनर्निर्देशन के लिए, |
कमांड के बीच पाइप करना, इत्यादि, शेल की सभी विशेषताएं हैं और उन्हें व्याख्या /bin/sh
या /bin/bash
कार्यान्वित करने के लिए कुछ की आवश्यकता होती है ।
यदि आप स्ट्रिंग सिंटैक्स पर जाते हैं CMD
, तो docker आपके कमांड को शेल के साथ चलाएगा:
CMD /etc/init.d/nullmailer start ; /usr/sbin/php5-fpm
अन्यथा, आपका दूसरा सिंटैक्स ठीक यही काम करता है:
CMD ["sh", "-c", "/etc/init.d/nullmailer start ; /usr/sbin/php5-fpm"]
ध्यान दें कि मैं कंटेनर के अंदर इस तरह से कई कमांड चलाने की सलाह नहीं देता हूं क्योंकि अगर आपका पहला कमांड विफल हो जाता है, तो कोई त्रुटि से निपटने में मदद नहीं करता है, खासकर अगर यह पृष्ठभूमि में चलता है। आप कंटेनर के अंदर पीड 1 के रूप में चल रहे एक शेल को भी छोड़ते हैं जो सिग्नल हैंडलिंग को तोड़ देगा, जिसके परिणामस्वरूप आपके कंटेनर में 10 सेकंड की देरी और अपमानजनक हत्या होगी। शेल exec
कमांड का उपयोग करके सिग्नल की हैंडलिंग को कम किया जा सकता है :
CMD /etc/init.d/nullmailer start ; exec /usr/sbin/php5-fpm
हालाँकि, पृष्ठभूमि में चुपचाप विफल होने वाली प्रक्रियाओं से निपटने के लिए आपको किसी तरह के मल्टी-प्रोसेस मैनेजर की तरह स्विच करने की आवश्यकता होती है, जैसे कि पर्यवेक्षक या अपने आवेदन को कई कंटेनरों में तोड़ना और उन्हें कुछ बनाने वाले जैसे कुछ के साथ तैनात करना।
exec
फॉर्म का उपयोग करना चाहिए , क्योंकि यह पसंदीदा फॉर्म है? इसे क्यों पसंद किया जाता है? या मुझे सरलshell
रूप का उपयोग करना चाहिए ?