কমান্ডের ফলাফলের জন্য কি ডকার ENV পরিবর্তনশীল সেট করা সম্ভব? পছন্দ:
ENV MY_VAR whoami
আমি চাই MY_VAR মানটি "রুট" বা যা-ই হোক না কেন মান পাই
উত্তর:
DarkSideF উত্তরের যোগ হিসাবে।
আপনার সচেতন হওয়া উচিত যে ডকফাইফিলের প্রতিটি লাইন / কমান্ড অন্য পাত্রে চালিত হয়।
আপনি এর মতো কিছু করতে পারেন:
RUN export bleah=$(hostname -f);echo $bleah;
এটি একক পাত্রে চালিত হয়।
$bleahহয় না এই রান কমান্ড বাহিরে যে কোনো জায়গায় উপলব্ধ না, এমনকি একই dockerfile পরবর্তী লাইনে, অন্য চিত্র এটি বন্ধ ভিত্তি করে এর একা যাক। ডকারের কাছ থেকে সত্যই স্পষ্ট অনুপস্থিত বৈশিষ্ট্যটি দেখে মনে হচ্ছে এটি কোনও ফাইল থেকে লেখা এবং পড়া হ'ল চিত্রগুলিতে (গতিশীল) ভেরিয়েবলগুলি সংরক্ষণ এবং চিত্রগুলির মধ্যে পাস করার একমাত্র উপায় যা সুপার হ্যাকি বলে মনে হয়।
আমার একই সমস্যা ছিল এবং ডকফাইলে রুন কমান্ডটি ব্যবহার করে ফাংশন হিসাবে পরিবেশ পরিবর্তনশীল সেট করার উপায় খুঁজে পেয়েছি।
উদাহরণস্বরূপ, আমি যখন চালাব তখন যেমন পরিবর্তন না করে কেবল একবারে রেল অ্যাপের জন্য SECRET_KEY_BASE সেট করতে হবে:
docker run -e SECRET_KEY_BASE="$(openssl rand -hex 64)"
পরিবর্তে এটি আমি ডকফায়াইল স্ট্রিংয়ের মতো লিখি:
RUN bash -l -c 'echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" >> /etc/bash.bashrc'
এবং আমার এনভি ভেরিয়েবল মূল থেকে লগইন করার পরেও উপলব্ধ। অথবা হতে পারে
RUN /bin/bash -l -c 'echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" > /etc/profile.d/docker_init.sh'
তারপরে এটি সিএমডি এবং ENTRYPOINT কমান্ডগুলিতে পরিবর্তনশীল উপলভ্য
ডকার এটিকে স্তর হিসাবে ক্যাশে করে এবং যদি আপনি এর আগে কিছু স্ট্রিং পরিবর্তন করেন তবেই পরিবর্তন হয়।
আপনি পরিবেশের পরিবর্তনশীল সেট করতে বিভিন্ন উপায়ে চেষ্টা করতে পারেন ।
*.shফাইল /etc/profile.d/পরিবেশ
এই সময়ে, কমান্ডের ফলাফলটি ব্যবহার করা যেতে পারে RUN export, তবে ENVভেরিয়েবলের জন্য বরাদ্দ করা যায় না ।
জ্ঞাত সমস্যা: https://github.com/docker/docker/issues/29110
এই উত্তরটি @ ডার্কসাইডএফের প্রতিক্রিয়া ,
তিনি যে পদ্ধতিটির প্রস্তাব দিচ্ছেন তা হ'ল Dockerfile:
RUN bash -l -c 'echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" >> /etc/bash.bashrc'
( একটি রফতানি যোগ করা/etc/bash.bashrc )
এটি ভাল তবে পরিবেশের পরিবর্তনশীল কেবলমাত্র প্রক্রিয়াটির জন্যই উপলভ্য হবে /bin/bashএবং আপনি যদি নোড.জেএস অ্যাপ্লিকেশনটির জন্য উদাহরণস্বরূপ আপনার ডকার অ্যাপ্লিকেশনটি চালানোর চেষ্টা করেন তবে /etc/bash.bashrcসম্পূর্ণভাবে উপেক্ষা করা হবে এবং চেষ্টা করার সময় আপনার অ্যাপ্লিকেশনটির কোনও একক চিহ্ন থাকবে না SECRET_KEY_BASEtrying অ্যাক্সেস করতে process.env.SECRET_KEY_BASE।
এই কারণেই ENVকীওয়ার্ডটি হ'ল প্রত্যেকে ডায়নামিক কমান্ডটি ব্যবহার করার চেষ্টা করছে কারণ আপনি যখনই আপনার ধারকটি চালাবেন বা কোনও execআদেশ ব্যবহার করবেন তখন ডকার ENVবর্তমানে চলমান প্রক্রিয়াটির প্রতিটি মানটি (অনুরূপ -e) পরীক্ষা করবে এবং পাইপ করবে ।
একটি সমাধান হ'ল একটি মোড়ক ব্যবহার করা ( এই গিথুব ইস্যুতে @ ডগলিনের ক্রেডিট )। envwrapperআপনার প্রকল্পের মূলটিতে একটি মোড়কযুক্ত ফাইল (যেমন ) রয়েছে:
#!/bin/bash
export SECRET_KEY_BASE="$(openssl rand -hex 64)"
export ANOTHER_ENV "hello world"
$*
এবং তারপরে আপনার Dockerfile:
...
COPY . .
RUN mv envwrapper /bin/.
RUN chmod 755 /bin/envwrapper
CMD envwrapper myapp
@ ডার্কসাইডএফের উত্তরের সংযোজন হিসাবে, আপনি যদি Dockerfile বিল্ড প্রক্রিয়া চলাকালীন কোনও পূর্ববর্তী কমান্ডের ফলাফলটি পুনরায় ব্যবহার করতে চান তবে আপনি নীচের কাজটি ব্যবহার করতে পারেন:
উদাহরণ স্বরূপ :
RUN echo "bla" > ./result
RUN echo $(cat ./result)
কিছু পরিষ্কার করার জন্য, আপনি নিম্নলিখিত টুকরোটি ব্যবহার করতে পারেন যা একটি ছোট সিএলআই সরবরাহ করে envstore.py:
RUN envstore.py set MY_VAR bla
RUN echo $(envstore.py get MY_VAR)
অথবা আপনি পাইথন-ডটেনভ লাইব্রেরি ব্যবহার করতে পারেন যা একই সি এল এল রয়েছে।
আপনি যা খুঁজছিলেন তা এটি কিনা তা নিশ্চিত নন তবে আপনার ENV vars বা ARGS ইনজেক্ট করার জন্য।
আপনার my_build.sh এ:
echo getting version of osbase image to build from
OSBASE=$(grep "osbase_version" .version | sed 's/^.*: //')
echo building docker
docker build -f \
--build-arg ARTIFACT_TAG=$OSBASE \
PATH_TO_MY.Dockerfile \
-t my_artifact_home_url/bucketname:$TAG .
আপনার একটি এআরজি পাওয়ার জন্য .ডোকিফিল স্নিপেটটি দেখতে দেখতে এটি হতে পারে:
FROM scratch
ARG ARTIFACT_TAG
FROM my_artifact_home_url/bucketname:${ARTIFACT_TAG}
বিকল্পভাবে আপনার .এনএভিভি পাওয়ার জন্য। ডকফরফিলটি স্নিপেটটি দেখতে দেখতে এটি পেতে পারে:
FROM someimage:latest
ARG ARTIFACT_TAG
ENV ARTIFACT_TAG=${ARTIFACT_TAG}
ধারণাটি হ'ল আপনি শেল স্ক্রিপ্টটি চালাচ্ছেন এবং এটি বিল্ডের বিকল্প হিসাবে পাসকৃত অর্গগুলির সাথে ডকফারফিলকে কল করে।