Dockerfile - कमांड के परिणाम के लिए ENV सेट करें


93

क्या कमांड के परिणाम के लिए docker ENV वैरिएबल सेट करना संभव है? पसंद:

ENV MY_VAR whoami

मैं चाहता हूं कि MY_VAR को मूल्य "रूट" या जो भी हो स्वामी लौटाए


जवाबों:


21

DarkSideF जवाब के अतिरिक्त।

आपको पता होना चाहिए कि डॉकफाइल में प्रत्येक लाइन / कमांड दूसरे कंटेनर में चलती है।

आप ऐसा कुछ कर सकते हैं:

RUN export bleah=$(hostname -f);echo $bleah;

यह एक एकल कंटेनर में चलाया जाता है।


15
बस स्पष्ट करने के लिए - $bleahहै नहीं इस आदेश चलाएं के बाहर उपलब्ध कहीं भी, यहां तक कि एक ही dockerfile में अगली पंक्ति, एक और छवि इसे बंद आधारित है में अकेले छोड़ दिया। डॉकटर के यहां से वास्तव में स्पष्ट रूप से गायब सुविधा, ऐसा लगता है कि किसी फ़ाइल से लिखना और पढ़ना वास्तव में छवियों में (गतिशील) चर को संग्रहीत करने और छवियों के बीच उन्हें पारित करने का एकमात्र तरीका है, जो सुपर हैकी लगता है।
डेविनकोविल

17

मेरे पास एक ही मुद्दा था और पर्यावरण चर को फ़ंक्शन में परिणाम के रूप में सेट करने का तरीका मिला।

उदाहरण के लिए, जब मैं चलाऊंगा तो बिना बदले केवल एक बार रेल एप्लिकेशन के लिए SECRET_KEY_BASE सेट करना होगा:

docker run  -e SECRET_KEY_BASE="$(openssl rand -hex 64)"

इसके बजाय मैं Dockerfile स्ट्रिंग को लिखता हूं जैसे:

RUN bash -l -c 'echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" >> /etc/bash.bashrc'

और मेरे env वैरिएबल को रूट से उपलब्ध है, बैश लॉगिन के बाद भी। या हो सकता है

RUN /bin/bash -l -c 'echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" > /etc/profile.d/docker_init.sh'

तब यह CMD और ENTRYPOINT कमांड में उपलब्ध चर है

डॉकर इसे परत के रूप में कैश करें और केवल तभी बदलें जब आप इससे पहले कुछ तार बदल दें।

आप पर्यावरण चर सेट करने के लिए विभिन्न तरीकों की कोशिश कर सकते हैं ।


क्या /etc/profile.d/docker_init.sh अभी भी एक चीज़ है? यह उत्तर केवल इस बात का उल्लेख है कि मैं Google के साथ मिल सकता हूं, और यह मेरे लिए काम नहीं करता है। क्या यह 2016 में शायद एक डॉकर निष्पादन इंजन का हिस्सा था जो अब चालू नहीं है?
सिग्मा

1
@SigmaX यह एक डॉकटर चीज नहीं है, यह एक लिनक्स चीज है। पर्यावरण को आबाद करने के लिए किसी भी *.shफ़ाइल /etc/profile.d/का उपयोग किया जाता है
मादाकॉल

11

इस समय, एक कमांड परिणाम के साथ प्रयोग किया जा सकता है RUN export, लेकिन एक ENVचर को नहीं सौंपा जा सकता है ।

ज्ञात समस्या: https://github.com/docker/docker/issues/29110


7

यह उत्तर @DarkSideF के लिए एक प्रतिक्रिया है ,

वह जिस विधि का प्रस्ताव कर रहा है वह निम्नलिखित है Dockerfile:

RUN bash -l -c 'echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" >> /etc/bash.bashrc'

( में एक निर्यात जोड़ने/etc/bash.bashrc )

यह अच्छा है, लेकिन पर्यावरण चर केवल इस प्रक्रिया के लिए उपलब्ध होगा /bin/bash, और यदि आप उदाहरण के लिए Node.js एप्लिकेशन के लिए अपने docker अनुप्रयोग को चलाने का प्रयास करते हैं, तो /etc/bash.bashrcइसे पूरी तरह से अनदेखा कर दिया जाएगा और आपके आवेदन में एक भी सुराग नहीं होगा SECRET_KEY_BASEजब कोशिश कर रहा हो तक पहुँचने के लिए process.env.SECRET_KEY_BASE

यही कारण है कि ENVकीवर्ड वह है जिसे हर कोई डायनेमिक कमांड के साथ उपयोग करने का प्रयास कर रहा है क्योंकि हर बार जब आप अपना कंटेनर चलाते हैं या execकमांड का उपयोग करते हैं , तो डॉकर ENVवर्तमान में चलने वाली (इसी तरह की -e) प्रक्रिया में हर मूल्य की जांच करेगा और पाइप करेगा ।

एक समाधान एक आवरण ( इस github मुद्दे में @duglin को क्रेडिट ) का उपयोग करना है। अपने प्रोजेक्ट रूट में एक रैपर फ़ाइल (जैसे ) रखें: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

4

@ DarkSideF के उत्तर के अतिरिक्त, यदि आप Dockerfile बिल्ड प्रक्रिया के दौरान अपने पिछले कमांड के परिणाम का पुन: उपयोग करना चाहते हैं, तो आप निम्न वर्कअराउंड का उपयोग कर सकते हैं:

  1. एक कमांड चलाएं, परिणाम को फाइल में स्टोर करें
  2. उस फ़ाइल से दूसरे परिणाम में पिछले परिणाम प्राप्त करने के लिए कमांड प्रतिस्थापन का उपयोग करें

उदाहरण के लिए :

RUN echo "bla" > ./result
RUN echo $(cat ./result)

कुछ क्लीनर के लिए, आप निम्नलिखित जीआईटी का भी उपयोग कर सकते हैं जो एक छोटा सीएलआई प्रदान करता है जिसे envstore.py:

RUN envstore.py set MY_VAR bla
RUN echo $(envstore.py get MY_VAR)

या आप अजगर-डॉटेनव लाइब्रेरी का उपयोग कर सकते हैं जिसमें एक समान सीएलआई है।


2

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

अपने 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}

विचार यह है कि आप शेल स्क्रिप्ट को चलाते हैं और कॉल करते हैं। निर्माण के विकल्प के रूप में पारित किए गए आर्ग के साथ डॉकरफाइल।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.