डॉक्टर समाधान:
ऐसा लगता है कि डॉकटर-कंपोजिट 1.5+ ने वैरिएबल सबस्टेशन को सक्षम किया है: https://github.com/docker/compose/releases
नवीनतम Docker Compose आपको अपनी रचना फ़ाइल से पर्यावरण चर का उपयोग करने की अनुमति देता है। तो आप अपने पर्यावरण चर को स्रोत कर सकते हैं, फिर लिखें जैसे:
set -a
source .my-env
docker-compose up -d
तब आप $ {VARIABLE} का उपयोग करके docker-compose.yml में चर का संदर्भ दे सकते हैं, जैसे:
db:
image: "postgres:${POSTGRES_VERSION}"
और यहाँ डॉक्स से अधिक जानकारी है, यहाँ लिया गया: https://docs.docker.com/compose/compose-file/#variable-substeration
जब आप इस कॉन्फ़िगरेशन के साथ डॉकटर-कंपोज़ करते हैं, तो कंपोज़ शेल में POSTGRES_VERSION वातावरण चर की तलाश करता है और इसके मूल्य को प्रतिस्थापित करता है। इस उदाहरण के लिए, कंपोज़ इमेज को पोस्टग्रेज करने के लिए हल करता है: 9.3 कॉन्फ़िगरेशन को चलाने से पहले।
यदि कोई पर्यावरण चर सेट नहीं है, तो रिक्त स्ट्रिंग के साथ विकल्प लिखें। ऊपर के उदाहरण में, यदि POSTGRES_VERSION सेट नहीं है, तो छवि विकल्प का मूल्य पोस्टग्रैजेस है:।
$ VARIABLE और $ {VARIABLE} सिंटैक्स दोनों का समर्थन किया जाता है। विस्तारित शैल-शैली की विशेषताएं, जैसे $ {VARIABLE-default} और $ {VARIABLE / foo / bar}, समर्थित नहीं हैं।
यदि आपको कॉन्फ़िगरेशन मान में शाब्दिक डॉलर का चिह्न लगाने की आवश्यकता है, तो डबल डॉलर चिह्न ($ $) का उपयोग करें।
और मेरा मानना है कि इस सुविधा को इस पुल अनुरोध में जोड़ा गया था: https://github.com/docker/compose/pull/1765
BASH समाधान:
मुझे लगता है कि लोगों को डॉकर के पर्यावरण चर समर्थन के साथ समस्या है। डॉकर में पर्यावरण चर के साथ व्यवहार करने के बजाय, आइए मूल बातों पर वापस जाएं, जैसे बैश! यहां बैश स्क्रिप्ट और .env
फ़ाइल का उपयोग करके अधिक लचीली विधि है ।
एक उदाहरण .env फ़ाइल:
EXAMPLE_URL=http://example.com
# Note that the variable below is commented out and will not be used:
# EXAMPLE_URL=http://example2.com
SECRET_KEY=ABDFWEDFSADFWWEFSFSDFM
# You can even define the compose file in an env variable like so:
COMPOSE_CONFIG=my-compose-file.yml
# You can define other compose files, and just comment them out
# when not needed:
# COMPOSE_CONFIG=another-compose-file.yml
फिर इस बैश स्क्रिप्ट को उसी डायरेक्टरी में चलाएं, जिसमें सब कुछ ठीक से तैनात होना चाहिए:
#!/bin/bash
docker rm -f `docker ps -aq -f name=myproject_*`
set -a
source .env
cat ${COMPOSE_CONFIG} | envsubst | docker-compose -f - -p "myproject" up -d
बस अपने bash फ़ाइल में सामान्य bash सिंटैक्स (यानी फ़ाइल से ${SECRET_KEY}
सम्मिलित करने के लिए ) के साथ अपने env चर को देखें ।SECRET_KEY
.env
नोट COMPOSE_CONFIG
मेरी में परिभाषित किया गया है .env
फ़ाइल और मेरी पार्टी स्क्रिप्ट में प्रयोग किया है, लेकिन आप आसानी से जगह ले सकता है {$COMPOSE_CONFIG}
के साथ my-compose-file.yml
बैश लिपि में।
यह भी ध्यान दें कि मैंने इस तैनाती को "myproject" उपसर्ग के साथ अपने सभी कंटेनरों का नाम देकर लेबल किया है। आप अपने इच्छित किसी भी नाम का उपयोग कर सकते हैं, लेकिन यह आपके कंटेनरों की पहचान करने में मदद करता है ताकि आप बाद में उन्हें आसानी से संदर्भित कर सकें। यह मानते हुए कि आपके कंटेनर बेकार हैं, जैसा कि उन्हें होना चाहिए, यह स्क्रिप्ट जल्दी से आपके कंटेनर को आपके .env फ़ाइल पैरामेट्स और आपके कंपोज़ YAML फ़ाइल के अनुसार हटा देगी।
अपडेट
चूंकि यह उत्तर काफी लोकप्रिय लगता है, मैंने एक ब्लॉग पोस्ट लिखी है जो मेरे डॉकियर परिनियोजन वर्कफ़्लो का अधिक गहराई से वर्णन करता है: http://lukeswart.net/2016/03/lets-deploy-part-1/ जब आप जोड़ते हैं तो यह मददगार हो सकता है एक परिनियोजन कॉन्फ़िगरेशन के लिए अधिक जटिलता, जैसे कि nginx config, LetsEncrypt certs, और लिंक किए गए कंटेनर।