2016-11-29 10 views
12

में सीएमडी को तर्क पारित करने के लिए डॉकर रन कमांड का उपयोग करें, मैं डॉकर के लिए नया हूं और मुझे डॉकर कंटेनर को स्थापित करने में कठिनाई हो रही है। मेरे पास एक नोडजेस ऐप शुरू होने पर दो पैरामीटर ले सकता है। उदाहरण के लिए, मैंडॉकरफाइल

node server.js 0 dev

या

node server.js 1 prod

उत्पादन मोड और देव मोड के बीच स्विच और अगर यह पर क्लस्टर कर देना चाहिए निर्धारित करने के लिए उपयोग कर सकते हैं। अब मैं इसी तरह की बात करने के लिए तर्क के साथ डोकर छवि बनाना चाहते हैं, केवल एक चीज मैं अब तक क्या कर सकते हैं एक पंक्ति

CMD [ "node", "server.js", "0", "dev"]

और

docker build -t me/app . निर्माण करने के लिए Dockerfile समायोजित करने के लिए है डोकर।

फिर docker run -p 9000:9000 -d me/app डॉकर चलाने के लिए।

लेकिन मैं prod मोड में स्विच करना चाहते हैं, मैं Dockerfile अध्यक्ष एवं प्रबंध निदेशक को बदलने के लिए

CMD [ "node", "server.js", "1", "prod"],

होने की जरूरत है और मैं पुराने एक बंदरगाह 9000 पर सुन मारने और छवि के पुनर्निर्माण की जरूरत है। मैं मैं कुछ की तरह

docker run -p 9000:9000 environment=dev cluster=0 -d me/app

एक छवि बनाने और चलाने के NodeJS "पर्यावरण" के साथ आदेश और तर्क "क्लस्टर" करने के लिए हो सकता है इच्छा, इसलिए मैं Dockerfile बदलने की जरूरत है और डोकर पुनर्निर्माण नहीं है और भी मैं यह कैसे हासिल कर सकता हूं?

उत्तर

17

सुनिश्चित करें कि आपके Dockerfile एक वातावरण चर with ENV वाणी बनाओ ।

फिर

आप कर सकते हैं pass an environment variable with docker run

docker run -p 9000:9000 -e environment=dev -e cluster=0 -d me/app 

या आप कर सकते हैं set them through your compose file:

node: 
    environment: 
    - environment=dev 
    - cluster=0 

आपका Dockerfile CMD कि वातावरण चर का उपयोग कर सकते हैं, लेकिन, के रूप में issue 5509 में उल्लेख किया है, तो आप एक में ऐसा करने की जरूरत है sh -c फॉर्म:

CMD ["sh", "-c", "node server.js ${cluster} ${environment}"] 

स्पष्टीकरण यह है कि शैल पर्यावरण चर का विस्तार करने के लिए ज़िम्मेदार है, न कि डॉकर। जब आप JSON वाक्यविन्यास का उपयोग करते हैं, तो आप स्पष्ट रूप से अनुरोध कर रहे हैं कि आपका आदेश खोल को बाईपास करें और सीधे निष्पादित किया जाए।

Builder RUN के साथ भी यही विचार (CMD पर लागू होता है के रूप में अच्छी तरह से):

खोल प्रपत्र के विपरीत, कार्यकारी प्रपत्र एक कमांड खोल आह्वान नहीं करता है।
इसका मतलब है कि सामान्य खोल प्रसंस्करण नहीं होता है।

उदाहरण के लिए, RUN [ "echo", "$HOME" ]$HOME पर चर प्रतिस्थापन नहीं करेंगे। यदि आप खोल प्रसंस्करण चाहते हैं तो या तो खोल फ़ॉर्म का उपयोग करें या सीधे एक खोल निष्पादित करें, उदाहरण के लिए: RUN [ "sh", "-c", "echo $HOME" ]

कार्यकारी फ़ॉर्म का उपयोग करके और सीधे एक खोल को क्रियान्वित करने, खोल फार्म के लिए मामले में है, यह खोल कि वातावरण चर विस्तार कर रही है, डोकर नहीं है।

+0

मैं डोकर फ़ाइल में ENV का उपयोग कैसे अध्यक्ष एवं प्रबंध निदेशक, आप मुझे एक उदाहरण दे सकते हैं कर सकते हैं? – Jaaaaaaay

+0

@Jaaaaaaay 'ENV' अपने' Dockerfile' (https://docs.docker.com/engine/reference/builder/#/env पढ़ें) है, जो तब 'द्वारा डोकर रन -e myVar = मूल्यवान हो जाएगा में एक घोषणा है myvalue' – VonC

+0

@Jaaaaayay मैंने आपके प्रश्न का समाधान करने के लिए उत्तर संपादित किया है। – VonC

4

डोकर कंटेनरों में यह करने के लिए विशिष्ट तरीका वातावरण चर में पारित करने के लिए है:

ENV environment default_env_value 
ENV cluster default_cluster_value 

ENV <key> <value> रूप replaced inline हो सकता है:

docker run -p 9000:9000 -e NODE_ENV=dev -e CLUSTER=0 -d me/app 
9

एक अन्य विकल्प निर्दिष्ट करने के लिए कि node तर्क प्रदान करने के लिए चलाने के लिए निष्पादन योग्य और CMD है ENTRYPOINT उपयोग करने के लिए है। दस्तावेज़ों में Exec form ENTRYPOINT example में एक उदाहरण है।

इस दृष्टिकोण का उपयोग करना, अपने Dockerfile देव में यह चल रहा है की तरह

FROM ... 

ENTRYPOINT [ "node", "server.js" ] 
CMD [ "0", "dev" ] 

कुछ देखने के लिए एक ही आदेश

docker run -p 9000:9000 -d me/app 

और उत्पादन में इसे चलाने का उपयोग आप चलाने के लिए पैरामीटर पास होगा होगा आदेश

docker run -p 9000:9000 -d me/app 1 prod 

आप पूरी तरह CMD छोड़ और हमेशा रन कमांड के तर्कों के रूप 0 dev या 1 prod में पारित कर सकते हैं। इस तरह आप गलती से देव में प्रोड कंटेनर या प्रोड में एक देव कंटेनर शुरू नहीं करते हैं।

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