2014-06-19 17 views
9

मेरे पास एक ऐसा एप्लिकेशन है जो REDIS_URL नामक पर्यावरण चर का उपयोग करता है। एक सामान्य REDIS_URLredis://172.17.0.5:6379/0 होगा। मैं कंटेनर जोड़ने के आधार पर REDIS_URL पॉप्युलेट करने के लिए सक्षम होने के लिए करना चाहते हैं:अनुप्रयोग पर्यावरण में जुड़े कंटेनर पर्यावरण चर का उपयोग करना?

docker run --name redis -d redis 
docker run --name firehose --link redis:redis -e REDIS_URL="redis://$REDIS_PORT_6379_TCP_ADDR:$REDIS_PORT_6379_TCP_PORT/0" -d firehose/server 

लेकिन यह कैसे मैं वातावरण चर से बचने के आधार पर, वे या तो डोकर रन टाइम पर मेरी खोल में मूल्यांकन किया है और खाली कर रहे हैं (redis://:/0) कर रहे हैं, या शाब्दिक तारों के रूप में पारित (redis://$REDIS_PORT_6379_TCP_ADDR:$REDIS_PORT_6379_TCP_PORT/0)।

मैं अपने REDIS_URL एप्लिकेशन पर्यावरण परिवर्तक को कैसे संयोजक लिंकिंग के आधार पर पॉप्युलेट कर सकता हूं?

उत्तर

7

$REDIS_PORT_6379_TCP_ADDR और $REDIS_PORT_6379_TCP_PORT वेरिएबल्स docker run कमांड निष्पादित होने पर ज्ञात नहीं हैं, इसलिए मेजबान से इसे बनाने का कोई तरीका नहीं है।

हालांकि, एक कामकाज है। में firehose/server छवि के लिए CMD या ENTRYPOINT होना चाहिए जो यह निर्धारित करता है कि छवि कब चलती है जब आदेश कम किया जाता है। आप उस कमांड के चारों ओर एक रैपर डाल सकते हैं जो REDIS_URL चर का निर्माण करेगा। कुछ इस तरह:

#!/bin/sh 
export REDIS_URL="redis://${REDIS_PORT_6379_TCP_ADDR}:${REDIS_PORT_6379_TCP_PORT}/0" 
<run command> 

CMD या ENTRYPOINTDockerfile में के रूप में आवरण स्क्रिप्ट का उपयोग करें।

+1

समझ में आता है। मैं 'REDIS_URL = $ {REDIS_URL: - "redis: // $ REDIS_PORT_6379_TCP_ADDR: $ REDIS_PORT_6379_TCP_PORT/0"} 'के साथ समाप्त हुआ, इसलिए मैं या तो कार्यक्षमता बरकरार रख सकता था। धन्यवाद! –

2

मुझे पहले विषय से थोड़ी दूर जाने दें। यदि आप एक एनवी वैरिएबल को एक सीएलआई वैरिएबल में कनवर्ट करना चाहते हैं तो आप डॉकर कंटेनर के अंदर वैरिएबल को बेवकूफ बनाकर एक रैपर स्क्रिप्ट से बच सकते हैं।

docker run image /bin/bash -c '/container-command $INSIDE_DOCKER' 

अब आप अपने कंटेनर के बाहर से शैल चर का उपयोग करने में सक्षम नहीं होने के बारे में शिकायत कर सकते हैं। नीचे दी गई तकनीक उस मामले में काम करती है:

docker run image /bin/bash -c "/container-command $OUTSIDE_DOCKER \$INSIDE_DOCKER" 

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

docker run image /bin/bash -c "export FOO=\${INSIDE_DOCKER}; echo \$FOO" 

संभावित लाभ इस कंटेनर के अंदर आवरण पर अपने मामले में है कि कंटेनर के अंदर आवरण हार्ड-कोडेड एक बंदरगाह और एक लिंक नाम करने के लिए है। डॉकर के बाहर एक रैपर लिखने का एक तरीका होना चाहिए जो प्रकाशित बंदरगाहों (संभावित रूप से डिफ़ॉल्ट कमांड के साथ) का निरीक्षण करता है और लिंक कमांड के अनुसार वैरिएबल सेट करता है ताकि आप हार्ड कोडिंग पर निर्भर न हों।

संबंधित मुद्दे