डॉकटर कंटेनर से पर्यावरण चर प्राप्त करें


124

डॉकर कंटेनर से एक पर्यावरण चर प्राप्त करने का सबसे सरल तरीका क्या है जिसे डॉकफेराइल में घोषित नहीं किया गया है ?

उदाहरण के लिए, एक पर्यावरण चर जिसे कुछ docker exec container /bin/bashसत्रों के माध्यम से सेट किया गया है ?

मैं कर सकता हूं docker exec container env | grep ENV_VAR, लेकिन मैं ऐसा कुछ पसंद करूंगा जो सिर्फ मूल्य लौटाए।

मैंने प्रयोग करने की कोशिश की है docker exec container echo "$ENV_VAR", लेकिन प्रतिस्थापन कंटेनर के बाहर होने लगता है, इसलिए मुझे कंटेनर से env var नहीं मिलता है, बल्कि अपने कंप्यूटर से env var मिलता है।

धन्यवाद।


क्या कोई कारण है कि आप एनवी और जीआरईपी का उपयोग नहीं करना चाहेंगे?
अइसबा 20

मुझे सिर्फ मूल्य चाहिए। अगर मैं सही तरीके से समझूं, तो मुझे grep कॉल के आउटपुट को पार्स करने की आवश्यकता होगी, और मैं इससे बचना चाहूंगा।
Citronen

मैंने सोचा था कि एक निष्पादन सत्र में सेट किया गया चर प्राथमिक प्रक्रिया या बाद के निष्पादन सत्रों को प्रभावित नहीं करता है?
पॉल बिकोटे

जवाबों:


137

echo "$ENV_VAR"कंटेनर के अंदर चलने का उचित तरीका ताकि कंटेनर में परिवर्तनीय प्रतिस्थापन हो:

docker exec <container_id> bash -c 'echo "$ENV_VAR"'

4
ध्यान दें कि ये सभी उत्तर कुछ शेल पर निर्भर करते हैं। मैं एक निष्पादन योग्य और एक खरोंच आधार छवि के साथ env चर प्राप्त करने में सक्षम नहीं हूं।
रिचर्ड

docker run --rm -it CONTAINER bash -c 'echo "$MY_ENV_VAR"'
हेनरिक

मुझे त्रुटि मिल रही है "त्रुटि: ऐसा कोई कंटेनर नहीं: कंटेनर"। मैं SSH के माध्यम से लॉगिन करने के बाद कमांड निष्पादित कर रहा हूं।
कुंवर नितेश

1
@kunwarnitesh: आपको उस कंटेनर के नाम के साथ "कंटेनर" को बदलने की आवश्यकता है जिसे आप चालू करना चाहते हैं।
jwodder

1
containerऐसा शब्द बनाइए कि लोग समझें कि यह एक चर है
अनवर

117

सभी env चर देखने के लिए:

docker exec container env

एक पाने के लिए:

docker exec container env | grep VARIABLE | cut -d'=' -f2

मेरा प्रश्न यह है कि मैं उस मार्ग पर नहीं जाना चाहूंगा। इसके अलावा, अनुवर्ती प्रश्न: docker exec container envऔर docker exec -it container /bin/bashऔर फिर envबाहर अलग बातें थूक। क्यों?
19ron में Citronen

आह ... मैं जिस विशिष्ट छवि का निर्माण कर रहा हूं वह विशिष्ट हो सकती है जो इस मामले को बनाती है ...
Citronen

2
हम्म, अब बहुत मुश्किल है। कोशिश करो docker inspect container
अइसबा

docker inspect containerलगता है एक ही सीमा है। यदि मैं कंटेनर को चलाने के बाद एक पर्यावरण चर बनाता हूं, तो यह docker inspect(env अनुभाग में) कॉल में प्रकट नहीं होता है ।
Citronen

मेरा मानना ​​है कि यह वर्तमान में स्वीकृत उत्तर की तुलना में बेहतर उत्तर है। हमारे पास कई कंटेनर हैं जो bashउदाहरण के लिए कमांड के साथ समर्थित नहीं हैं alpine-node। इसलिए exec container bash -c "echo $ENV_VAR"काम नहीं कर रहे हैं। exec container envमेरे मामले के लिए कार्यों का उपयोग करना । का उपयोग exec container printenvभी काम करता है।
rahmatns

78

आप उपयोग कर सकते हैं printenv VARIABLEके बजाय /bin/bash -c 'echo $VARIABLE। यह बहुत सरल है और यह प्रतिस्थापन नहीं करता है:

docker exec container printenv VARIABLE

7
यह अंतिम उत्तर होना चाहिए
Ki Jéy

5
या बस printenvसभी चर प्रिंट करने के लिए।
नाका

कुबेरनेट्स के लिए भी यह काम करता है: kubectl exec pod-name printenv MY_VARIABLE।
तेबू

58

उपयोग करने docker execका नकारात्मक पक्ष यह है कि इसके लिए एक चलने वाले कंटेनर की आवश्यकता होती है , इसलिए docker inspect -fयदि आप अनिश्चित हैं कि कंटेनर चल रहा है , तो यह आसान हो सकता है।

उदाहरण 1। निर्दिष्ट कंटेनर में अंतरिक्ष-अलग पर्यावरण चर की एक सूची आउटपुट करें:

docker inspect -f \
   '{{range $index, $value := .Config.Env}}{{$value}} {{end}}' container_name

आउटपुट इस तरह दिखेगा:

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3

उदाहरण # 2। नई लाइन और grepआवश्यक वस्तुओं पर प्रत्येक env var आउटपुट , उदाहरण के लिए, mysql कंटेनर की सेटिंग्स को इस तरह से पुनः प्राप्त किया जा सकता है:

docker inspect -f \
    '{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' \
    container_name | grep MYSQL_

उत्पादन होगा:

MYSQL_PASSWORD=secret
MYSQL_ROOT_PASSWORD=supersecret
MYSQL_USER=demo
MYSQL_DATABASE=demodb
MYSQL_MAJOR=5.5
MYSQL_VERSION=5.5.52

उदाहरण # 3। आइए ऊपर दिए गए उदाहरण को संशोधित करके एक बैश मैत्रीपूर्ण आउटपुट प्राप्त करें जिसे सीधे आपकी स्क्रिप्ट में उपयोग किया जा सकता है:

docker inspect -f \
   '{{range $index, $value := .Config.Env}}export {{$value}}{{println}}{{end}}' \
   container_name | grep MYSQL

उत्पादन होगा:

export MYSQL_PASSWORD=secret
export MYSQL_ROOT_PASSWORD=supersecret
export MYSQL_USER=demo
export MYSQL_DATABASE=demodb
export MYSQL_MAJOR=5.5
export MYSQL_VERSION=5.5.52

यदि आप अधिक गहरा गोता लगाना चाहते हैं, तो प्रारूप के सभी विवरणों के साथ गो के टेक्स्ट / टेम्प्लेट पैकेज प्रलेखन पर जाएं ।


1
यह सबसे अच्छा जवाब है। मुझे लगता है कि एक अलग सवाल पर जवाब होना चाहिए (जब कंटेनर नीचे है)
निकोले कोंडरांटेंको

यह एकमात्र उत्तर है जिसने मेरे लिए काम किया। docker execहमेशा कहा कि मेरा कंटेनर पता नहीं है।
गुड नाइट नर्ड प्राइड

7

उपरोक्त उत्तर में से कोई भी आपको नहीं दिखाता है कि एक गैर-चलने वाले कंटेनर से एक चर कैसे निकाला जाए (यदि आप echoदृष्टिकोण का उपयोग करते हैंrun , तो आपको कोई आउटपुट नहीं मिलेगा)।

बस के runसाथ printenv, जैसे:

docker run --rm <container> printenv <MY_VAR>

(ध्यान दें कि काम के docker-composeबजाय dockerभी)


बहुत सीधा! मैं इस दृष्टिकोण के लिए बस गया।
opncow

या बस printenvसभी चर प्रिंट करने के लिए।
नाका

2

किसी भी संयोग से आप का उपयोग करते हैं VSCode और स्थापित किया है डोकर विस्तार , बस right+ clickडोकर आप (के भीतर जाँच करना चाहते हैं पर डोकर विस्तार ), clickपर निरीक्षण , और वहाँ के लिए खोज env , आप अपने सभी मिलेगा env चर मान


0

@ ऐसबा का जवाब काम करता है अगर आपको परवाह नहीं है कि पर्यावरण चर घोषित किया गया था। यदि आप पर्यावरण चर चाहते हैं, भले ही इसे exec /bin/bashसत्र के अंदर घोषित किया गया हो , तो कुछ का उपयोग करें:

IFS="=" read -a out <<< $(docker exec container /bin/bash -c "env | grep ENV_VAR" 2>&1)

यह बहुत सुंदर नहीं है, लेकिन यह काम हो जाता है।

तब मान प्राप्त करने के लिए, का उपयोग करें:

echo ${out[1]}

देखिए jwodder का जवाब।
सिट्रोनन

0

यह आदेश होस्ट में docker स्टैक प्रक्रियाओं के वातावरण का निरीक्षण करता है:

pidof   dockerd containerd containerd-shim | tr ' ' '\n' \
      | xargs -L1 -I{} -- sudo xargs -a '/proc/{}/environ' -L1 -0

0

हम कमांड के entrypointसाथ नॉन-रनिंग कंटेनर को संशोधित कर सकते हैं docker run

उदाहरण दिखा पाथ पर्यावरण चर:

  1. उपयोग करना bashऔर echo: यह उत्तर दावा करता है कि echoकोई भी उत्पादन नहीं करेगा, जो गलत है।

    docker run --rm --entrypoint bash <container> -c 'echo "$PATH"'
  2. का उपयोग करते हुए printenv

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