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


102

मेरे डॉकफाइल के अंदर:

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

त्रुटि:

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

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

नोट: यदि मैं डॉकर फ़ाइल से सीएमडी लाइन हटाता हूं और फिर डॉकटर कंटेनर चलाता हूं, तो मैं मैन्युअल रूप से कंटेनर के अंदर से Django-admin startproject $ PROJECTNAME चलाने में सक्षम हूं और यह परियोजना का निर्माण करेगा ...


1
आप कैसे और कब परिभाषित कर रहे हैं $PROJECTNAME?
पायोत्र विट्चेन

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

आप किस प्रकार के चर का मतलब है: डॉकफाइल चर या पर्यावरणीय चर (आपके सिस्टम रनटाइम में)?
एमिक्स

जवाबों:


160

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

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

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

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

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

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

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

CMD django-admin startproject $PROJECTNAME

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

@ लार्क्स एक साधारण स्ट्रिंग अद्भुत है
उदितबेल

आपने मेरा दिन बचाया है!
सुप्रतीम रॉय

18

यदि आप रनटाइम पर मान का उपयोग करना चाहते हैं, तो मान को सेट ENVकरें Dockerfile। यदि आप इसे बिल्ड-टाइम पर उपयोग करना चाहते हैं, तो आपको इसका उपयोग करना चाहिए ARG

उदाहरण :

ARG value
ENV envValue=$value
CMD ["sh", "-c", "java -jar ${envValue}.jar"]

बिल्ड कमांड में मान पास करें:

docker build -t tagName --build-arg value="jarName"

10

कहते हैं कि आप एक कंटेनर के अंदर एक जावा प्रक्रिया शुरू करना चाहते हैं:

उदाहरण डॉकरीफाइल अंश:

ENV JAVA_OPTS -XX +UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -XshowSettings:vm 
... 
ENTRYPOINT ["/sbin/tini", "--", "entrypoint.sh"] 
CMD ["java", "${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 "$@")

0

ऊपर से प्रेरित, मैंने ऐसा किया:

#snapshot by default. 1 is release.
ENV isTagAndRelease=0

CMD     echo is_tag: ${isTagAndRelease} && \
        if [ ${isTagAndRelease} -eq 1 ]; then echo "release build"; mvn -B release:clean release:prepare release:perform; fi && \
        if [ ${isTagAndRelease} -ne 1 ]; then echo "snapshot build"; mvn clean install; fi && \ 
       .....
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.