Json वाक्य रचना की CMD
(और RUN
और ENTRYPOINT
) कर्नेल को सीधे एक निष्पादन सिस्कॉल के रूप में तर्क पास करें । निष्पादन सिस्कॉल में रिक्त स्थान, उद्धरणों से बचने, आईओ पुनर्निर्देशन, परिवर्तनीय प्रतिस्थापन, आदेशों के बीच पाइपिंग, एकाधिक कमांड चलाने आदि से तर्कों से कमांड को अलग नहीं किया जाता है । सिस्कॉल केवल निष्पादन योग्य को चलाने के लिए और उस निष्पादन योग्य को पारित करने के लिए तर्कों की सूची लेता है, और यह इसे चलाता है ।
जैसे पात्र $
चर का विस्तार करने के लिए, ;
आदेशों को अलग करने के लिए,
(अंतरिक्ष) तर्कों को अलग करने के लिए, &&
और ||
चेन कमांड के लिए, >
आउटपुट पुनर्निर्देशन के लिए, |
कमांड आदि के बीच पाइप करने के लिए, शेल की सभी विशेषताएं हैं और कुछ इस तरह की आवश्यकता है /bin/sh
या /bin/bash
उनकी व्याख्या और कार्यान्वयन करना ।
यदि आप स्ट्रिंग सिंटैक्स पर स्विच करते हैं CMD
, डॉकर आपके कमांड को शेल के साथ चलाएगा:
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
हालांकि, पृष्ठभूमि में चुपचाप विफल होने वाली प्रक्रियाओं को संभालने के लिए आपको पर्यवेक्षक जैसे किसी प्रकार के बहु-प्रक्रिया प्रबंधक पर स्विच करने की आवश्यकता होती है, या अधिमानतः अपने आवेदन को कई कंटेनरों में तोड़ दें और उन्हें डॉकर-कंपोज़ जैसी किसी चीज़ के साथ तैनात करें ।