डॉकरीफाइल में एक चर को कैसे परिभाषित किया जाए?


155

मेरे डॉकफाइल में , मैं उन चरों को परिभाषित करना चाहूंगा जिनका उपयोग मैं बाद में डॉकरफाइल में कर सकता हूं

मैं ENVनिर्देश से अवगत हूं , लेकिन मैं नहीं चाहता कि ये चर पर्यावरण चर रहे हों।

क्या डॉकरीफाइल दायरे में चर घोषित करने का कोई तरीका है ?


10
आप ARG का उपयोग कर सकते हैं - docs.docker.com/engine/reference/builder/#arg
lumos0815

@ lumos0815, मुझे लगता है कि आपको अपने उत्तर के रूप में पोस्ट करना चाहिए (भले ही यह एक पुरानी पोस्ट है; पोस्टरिटी के लिए) जैसा कि ओपी पूछ रहा है।
shriek

एआरजी एक ऐसे संस्करण को परिभाषित नहीं करता है जिसे डॉकफाइल के भीतर इस्तेमाल किया जा सकता है। आपको ईटीवी कमांड के साथ यह बताना होगा कि आप क्या खोज रहे हैं; एआरजी फू; ENV FOO = $ foo; कॉपी फ़ाइल $ फू (खराब स्वरूपण के लिए खेद है, मुझे लगता है कि कोड ब्लॉक करना और फोन से मल्टी लाइन करना संभव नहीं है)
ntwrkguru

जवाबों:


111

आप उपयोग कर सकते हैं ARG- https://docs.docker.com/engine/reference/builder/#arg देखें

ARGअनुदेश एक चर है कि उपयोगकर्ताओं को साथ बिल्डर को निर्माण समय में पारित कर सकते हैं परिभाषित करता है docker buildआदेश का उपयोग --build-arg <varname>=<value>झंडा। यदि कोई उपयोगकर्ता एक बिल्ड तर्क निर्दिष्ट करता है जो डॉकफाइल में परिभाषित नहीं किया गया था, तो बिल्ड एक त्रुटि उत्पन्न करता है।


@MargachChris COPY के लिए वैरिएबल का उपयोग करना संभव होना चाहिए
lumos0815

यह COPY कमांड के लिए काम नहीं करता है। docs.docker.com/engine/reference/builder/#arg
स्त्रीलिंग

54

मेरे ज्ञान के अनुसार, केवल ENV" पर्यावरण प्रतिस्थापन " में उल्लिखित अनुमति देता है

पर्यावरण चर ( ENVकथन के साथ घोषित ) का उपयोग कुछ निर्देशों में भी किया जा सकता है, क्योंकि चर को डॉकरीफाइल द्वारा व्याख्या किया जा सकता है।

डॉकएफ़िल की प्रत्येक पंक्ति के लिए बनाए गए प्रत्येक नए कंटेनरों में पुनर्विकसित होने के लिए उन्हें पर्यावरण चर होना चाहिए docker build

दूसरे शब्दों में, उन चरों की व्याख्या सीधे डॉकरीफाइल में नहीं की जाती है, लेकिन डॉकरीफाइल लाइन के लिए बनाए गए कंटेनर में, इसलिए पर्यावरण चर का उपयोग होता है।


इस दिन, मैं दोनों का उपयोग करता हूं ARG( 1.10+ औरdocker build --build-arg var=value ) और ENV। अकेले
उपयोग करने का ARGमतलब है कि आपका वैरिएबल बिल्ड टाइम पर दिखाई देता है, रनटाइम पर नहीं

मेरा डॉकफाइल आमतौर पर होता है:

ARG var
ENV var=${var}

आपके मामले में, ARGयह पर्याप्त है: मैं इसका उपयोग आमतौर पर http_proxy चर सेट करने के लिए करता हूं, जो कि बिल्ड समय पर इंटरनेट एक्सेस करने के लिए docker बिल्ड की जरूरत है।


51

तुम्हारे प्रश्न का उत्तर देने के लिए:

मेरे डॉकफाइल में, मैं उन चरों को परिभाषित करना चाहूंगा जिनका उपयोग मैं बाद में डॉकरफाइल में कर सकता हूं।

आप इसके साथ एक चर को परिभाषित कर सकते हैं:

ARG myvalue=3

समान वर्ण के आसपास रिक्त स्थान की अनुमति नहीं है।

और बाद में इसका उपयोग करें:

RUN echo $myvalue > /test

13

यदि चर एक ही RUNनिर्देश के भीतर फिर से उपयोग किया जाता है , तो कोई केवल एक शेल चर सेट कर सकता है। मैं वास्तव में पसंद करता हूं कि कैसे उन्होंने आधिकारिक रूबी डॉकरीफाइल के साथ संपर्क किया ।


बहुत बढ़िया जवाब। यदि आपको संभव हो तो एआरजी का उपयोग करना चाहिए, कभी-कभी आपको एक गतिशील चर को असाइन करने और फिर से उपयोग करने की आवश्यकता होती है। उदाहरण:RUN foo=$(date) && echo $foo
बुद्धिमानबीम

3

आप उपयोग कर सकते हैं ARG variable defaultValueऔर रन कमांड के दौरान आप इस मान को अपडेट करके भी उपयोग कर सकते हैं --build-arg variable=value। डॉक फ़ाइल में इन चरों का उपयोग करने के लिए आप उन्हें $variableरन कमांड के रूप में संदर्भित कर सकते हैं ।

नोट: ये चर लिनक्स कमांडों के लिए उपलब्ध RUN echo $variableहोंगे और वे छवि में बने नहीं रहेंगे।

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