2014-12-30 18 views
34

में बिल्ड समय पर गतिशील वातावरण चर बनाएं, मेरा विशिष्ट उपयोग केस यह है कि मैं ईसी 2 इंस्टेंस के बारे में कुछ डेटा व्यवस्थित करना चाहता हूं, एक कंटेनर चल रहा है और मुझे पर्यावरण चर के रूप में उपलब्ध कराता है। कंटेनर बनने पर मैं ऐसा करना चाहता हूं।डॉकर

मैं अपने डॉकरफ़ाइल में ENV VAR_NAME $(./script/that/gets/var) जैसे कुछ करने में सक्षम होने की उम्मीद कर रहा था, लेकिन आश्चर्यजनक रूप से यह काम नहीं करता है (आपको केवल $(./script... स्ट्रिंग मिलती है)।

मुझे यह उल्लेख करना चाहिए कि मुझे पता है कि docker run --env... ऐसा करेगा, लेकिन मैं विशेष रूप से इसे कंटेनर में बनाना चाहता हूं।

क्या मुझे कुछ याद आ रही है? क्या यह भी संभव है?

+0

जब आप '/ script/that/gets/var' चलाने के लिए चाहते हैं? डॉकर फाइलें बिल्ड समय के लिए हैं। यदि आप कंटेनर बूट समय पर कुछ चलाना चाहते हैं, तो बस एक स्क्रिप्ट बनाएं जो '।/Script/that/gets/var' और फिर मुख्य आदेश चलाती है। – generalhenry

+0

मैं इसे बिल्ड समय पर चलाने और पर्यावरण चर बनाने के लिए चाहता हूं जो रन टाइम पर उपस्थित होंगे। – Evan

उत्तर

28

डोकर v1.9 या नए

आप डोकर v1.9 या नए प्रयोग कर रहे हैं, इस बिल्ड समय बहस के लिए समर्थन के माध्यम से संभव है। Dockerfile में using the ARG statement द्वारा तर्क घोषित किए गए हैं।

ARG REQUIRED_ARGUMENT 
ARG OPTIONAL_ARGUMENT=default_value 

आप बाद में वास्तव में docker build का उपयोग कर अपने छवि का निर्माण जब आप docker docs में वर्णित के रूप झंडा --build-arg के माध्यम से तर्क पारित कर सकते हैं।

$ docker build --build-arg REQUIRED_ARGUMENT=this-is-required . 

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

इसके अलावा, बिल्ड-टाइम चर के great impact on caching हो सकते हैं। इसलिए डॉकरफाइल को बहुत सावधानी से बनाया जाना चाहिए ताकि जितना संभव हो सके कैशिंग का उपयोग करने में सक्षम हो और उसमें इमारत की प्रक्रिया तेज हो।

संपादित करें: "v1.9 से नया डॉकर" -part leedm777:s answer से इनपुट के बाद जोड़ा गया था।


डोकर v1.9

आप 1.9 से पहले एक डोकर-संस्करण का उपयोग कर रहे हैं, तो पहले, ARG/--build-arg दृष्टिकोण संभव नहीं था। आप निर्माण के दौरान इस तरह की जानकारी को हल नहीं कर सके, इसलिए आपको उन्हें docker run कमांड के पैरामीटर के रूप में पास करना पड़ा।

डॉकर छवियां समय के साथ संगत होने के दौरान हैं, जबकि कंटेनरों को tweaked किया जा सकता है और "प्रक्रियाओं को फेंकने" के रूप में माना जा सकता है।

  • अधिक जानकारी के बारे में ENV
  • एक डोकर चर्चा के बारे में dynamic builds

इस समस्या का समाधान वर्ष templating उपयोग करने के लिए किया गया था। यह एक साफ समाधान नहीं है लेकिन उस समय बहुत कम व्यवहार्य विकल्पों में से एक था। (this discussion से प्रेरणा)।

  1. एक json या YAML फ़ाइल
  2. एक डोकर फ़ाइल बनाने "टेम्पलेट" जहां गतिशील बाद में विस्तार किया जा सकता
  3. एक स्क्रिप्ट है कि कुछ का उपयोग कर config डेटा से एक Dockerfile बनाता बारे में अपना समस्त डायनामिक डेटा सेव templating पुस्तकालय है कि आप के साथ
+0

पुन: "डॉकर छवियों का उद्देश्य बहुत संगत होना", मुझे यह मिलता है लेकिन यह विशेष रूप से कंटेनर के बारे में है, जिसमें सभी प्रकार की गतिशील चीजें चल रही हैं। – Evan

+0

मेरे उपयोग के मामले के लिए टेम्पलेट दृष्टिकोण के साथ समस्या यह है कि ऐप लोचदार बीनस्टॉक पर चल रहा है और बिल्ड चरण को सेवा द्वारा नियंत्रित किया जाता है, इसलिए मुझे उस स्थान पर संकलित नहीं किया जा सकता है जहां मैं वास्तव में इसकी परवाह करता हूं (हालांकि यह निश्चित रूप से होगा अन्य उपयोग मामलों के लिए इस समस्या को हल करें)। – Evan

+0

@Evan सुनें, कठिन समस्या सुनें। फिर जवाब है: नहीं - आप कुछ भी याद नहीं कर रहे हैं और यह संभव नहीं है;) – wassgren

3

कंटेनर में ENV VAR_NAME $(./script/that/gets/var) निर्माण करने के लिए परिचित हैं, का निर्माण समय में एक गतिशील Dockerfile बनाएँ:

$ docker build -t awesome -f Dockerfile . 
$ # get VAR_NAME value: 
$ VAR_VALUE=`docker run --rm awesome \ 
    bash -c 'echo $(./script/that/gets/var)'` 
$ # use dynamic Dockerfile: 
$ { 
    echo "FROM awesome" 
    echo "ENV VAR_NAME $VAR_VALUE" 
    } | docker build -t awesome - 

https://github.com/42ua/docker-autobuild/blob/master/emscripten-sdk/README.md#build-docker-image

30

डॉकर 1.9 has added support for build time arguments

अपने Dockerfile में, आप add an ARG statement, जिसमें ENV पर समान वाक्यविन्यास है।

ARG FOO_REQUIRED 
ARG BAR_OPTIONAL=something 

निर्माण समय, आपको लगता है कि निर्माण के लिए तर्क स्थापित करने के लिए pass a --build-arg argument पारित कर सकते हैं। ARG जिसे Dockerfile में डिफ़ॉल्ट मान नहीं दिया गया था निर्दिष्ट होना चाहिए।

$ docker build --build-arg FOO_REQUIRED=best-foo-ever . 
+4

साइड सवाल ... यह लोचदार बीनस्टॉक पर एक निर्माण के लिए कैसे पारित किया जाता है? AFAIK आप लोचदार बीनस्टॉक पर एक डॉकर परिनियोजन के लिए एक बिल्ड कमांड प्रदान नहीं कर सकते हैं। – user1658296