2016-11-06 10 views
12

मेरी Dockerfile के अंदर:मैं डॉकरफ़ाइल सीएमडी के अंदर एक चर का उपयोग कैसे कर सकता हूं?

ENV PROJECTNAME mytestwebsite 
CMD ["django-admin", "startproject", "$PROJECTNAME"] 

त्रुटि:

CommandError: '$PROJECTNAME' is not a valid project name 

तेज वैकल्पिक हल यहाँ क्या है? क्या डॉकर के पास डॉकर के बाद के संस्करणों में "फिक्स" करने या इस कार्यक्षमता को पेश करने की कोई योजना है?

नोट: अगर मैं डोकर फ़ाइल से अध्यक्ष एवं प्रबंध निदेशक लाइन निकालें और फिर डोकर कंटेनर चलाने के लिए, मैं मैन्युअल रूप से कंटेनर के अंदर से Django-व्यवस्थापक startproject $ ProjectName चलाने के लिए सक्षम हूँ और यह परियोजना का निर्माण करेगा ...

+1

कैसे और कब आप '$ PROJECTNAME' परिभाषित कर रहे हैं? –

+0

ENV का उपयोग करके मेरे डॉकरफ़ाइल की शुरुआत में। इसके अलावा मैं यह उल्लेख करना भूल गया कि अगर मैं डॉकरफाइल से सीएमडी लाइन हटा देता हूं और फिर कंटेनर के अंदर से कंटेनर चलाता हूं, तो मैं इस कमांड को चला सकता हूं और यह प्रोजेक्ट तैयार करेगा (जिसका मतलब एनएनवी वैरिएबल मान्य है)। – david

+0

आपका किस प्रकार का चर का अर्थ है: डॉकरफाइल चर या पर्यावरण चर (जैसे आपके सिस्टम रनटाइम में)? –

उत्तर

18

आप एक निष्पादन सूची का उपयोग करते हैं ... के रूप में,

CMD ["django-admin", "startproject", "$PROJECTNAME"] 

... तो डोकर दिया आदेश सीधे निष्पादित करेगा, एक खोल से जुड़े बिना। चूंकि कोई खोल शामिल है, इसका मतलब है:

  • कोई चर विस्तार
  • कोई वाइल्डकार्ड विस्तार
  • के माध्यम से
  • > के साथ कोई आई/ओ पुनर्निर्देशन, <, |, आदि
  • नहीं कई आदेशों command1; command2
  • और बहुत आगे।

यदि आप चर का विस्तार करने के लिए अपने CMD चाहते हैं, तो आपको एक खोल की व्यवस्था करने की आवश्यकता है। आप क्या कर सकते हैं कि इस तरह:

CMD ["sh", "-c", "django-admin startproject $PROJECTNAME"] 

या आप जो आप एक परिणाम काफी हद तक पिछले उदाहरण के समान हो जाता है एक निष्पादन सूची के बजाय एक साधारण स्ट्रिंग, उपयोग कर सकते हैं:

CMD django-admin startproject $PROJECTNAME 
+0

अपडेट किया है डॉकर के अंक ट्रैकर में कुछ और पढ़ना: https://github.com/docker/docker/issues/5509 – jannis

+0

"सी" के बाद कॉमा गायब है। – Ako

+0

@ako, धन्यवाद, तय किया गया। – larsks

1

कहते हैं कि तुम चाहते चलें एक कंटेनर के अंदर एक जावा प्रक्रिया शुरू करने के लिए। इस मामले में आपको और विकल्प चाहिए और आप प्रक्रिया को सीधे शुरू करना चाहते हैं (उदाहरण के लिए। टोमकैट के मामले में catalina.sh wrapper के बिना)। सबसे पहले catalina.sh wrapper का उपयोग कर प्रक्रिया शुरू करें। फिर कंटेनर के अंदर पीएस ef | कम का उपयोग कर अपनी प्रक्रिया के निष्पादन विवरण को पकड़ो। अब विकल्प और कमांड सेक्शन को उप-विभाजित करें और यह आपका नया सीएमडी होगा।

उदाहरण Dockerfile अंश:

ENV JAVA_OPTS -XX +UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -XshowSettings:vm 
... 
ENTRYPOINT ["/sbin/tini", "--", "entrypoint.sh"] 
CMD ["myprocess", "${JAVA_OPTS}", "-myargument=true"] 

उदाहरण entrypoint.sh अंश:

#!/bin/sh 
... 
echo "*** Startup $0 suceeded now starting service using eval to expand CMD variables ***" 
exec su-exec mytechuser $(eval echo "[email protected]") 
संबंधित मुद्दे

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