আমি কীভাবে ডকফাইফিল সিএমডির অভ্যন্তরে একটি পরিবর্তনশীল ব্যবহার করতে পারি?


112

আমার ডকফাইলে ভিতরে:

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

ত্রুটি:

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

এখানে দ্রুততম কাজটি কী? ডকারের পরবর্তী সংস্করণগুলিতে এই কার্যকারিতাটি "ঠিক" করার বা প্রবর্তনের কোনও পরিকল্পনা আছে কি?

দ্রষ্টব্য: আমি যদি ডকার ফাইল থেকে সিএমডি লাইনটি সরিয়ে ফেলি এবং তারপরে ডকার কনটেইনারটি চালিত করি, তবে আমি নিজেই কন্টেইনারটির ভিতরে থেকে জ্যাঙ্গো-অ্যাডমিন স্টার্টপ্রজেক্ট $ প্রকল্পের নাম চালাতে সক্ষম হয়েছি এবং এটি প্রকল্পটি তৈরি করবে ...


4
আপনি কখন এবং কখন সংজ্ঞা দিচ্ছেন $PROJECTNAME?
পাইওটর উইটচেন

ENV ব্যবহার করে আমার ডকফায়িলের শুরুতে। এছাড়াও আমি উল্লেখ করতে ভুলে গেছি যে আমি যদি ডকফাইফাইল থেকে সিএমডি লাইনটি সরিয়ে ফেলা এবং তারপরে কনটেইনারটি চালিত করি তবে ধারকটির ভিতরে থেকে আমি এই আদেশটি চালাতে পারি এবং এটি প্রকল্পটি তৈরি করবে (যার অর্থ ENV ভেরিয়েবলটি বৈধ)।
ডেভিড

কোন ধরণের ভেরিয়েবল বলতে আপনি বোঝায়: ডকফেরফিল ভেরিয়েবল বা পরিবেশগত পরিবর্তনশীল (আপনার সিস্টেম রানটাইমের মতো)?
এমিক্স

উত্তর:


171

আপনি যখন একটি কার্যনির্বাহী তালিকা ব্যবহার করেন, তেমন ...

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

... তারপরে ডকার শেল জড়িত না করে প্রদত্ত কমান্ডটি সরাসরি চালিত করবে । যেহেতু কোনও শেল জড়িত নেই, এর অর্থ:

  • কোনও পরিবর্তনশীল সম্প্রসারণ নেই
  • কোনও ওয়াইল্ডকার্ড সম্প্রসারণ নেই
  • কোন I / O ফেরৎ দিয়ে >, <, |, ইত্যাদি
  • এর মাধ্যমে কোনও একাধিক আদেশ নেই command1; command2
  • এবং তাই এগিয়ে।

আপনি যদি CMDভেরিয়েবলগুলি প্রসারিত করতে চান তবে আপনাকে শেলের ব্যবস্থা করতে হবে। আপনি এটির মতো এটি করতে পারেন:

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

অথবা আপনি এক্সিকিউশন তালিকার পরিবর্তে একটি সাধারণ স্ট্রিং ব্যবহার করতে পারেন, যা আপনাকে পূর্ববর্তী উদাহরণের সাথে বেশিরভাগ ক্ষেত্রেই একই ফল দেয়:

CMD django-admin startproject $PROJECTNAME

4
ডকারের ইস্যু ট্র্যাকারে আরও কিছু পড়া: github.com/docker/docker/issues/5509
জান্নিস

21

আপনি রানটাইমের সময় মানটি ব্যবহার করতে চাইলে মানটি সেট ENVকরুন Dockerfile। আপনি যদি বিল্ড-টাইমে এটি ব্যবহার করতে চান তবে আপনার ব্যবহার করা উচিত ARG

উদাহরণ:

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

বিল্ড কমান্ডে মানটি পাস করুন:

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

12

বলুন যে আপনি একটি ধারকটির ভিতরে জাভা প্রক্রিয়া শুরু করতে চান:

উদাহরণস্বরূপ ডকফরফাইল অংশ:

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

এন্ট্রিপয়েন্ট পয়েন্ট উদাহরণস্বরূপ:

#!/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 && \ 
       .....
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.