ডকার কনটেইনার থেকে পরিবেশ পরিবর্তনযোগ্য পান


124

ডকফেরিয়লে ঘোষণা করা হয়নি এমন ডকার পাত্রে পরিবেশের পরিবর্তনশীল পাওয়ার সহজতম উপায় কী What's ?

উদাহরণস্বরূপ, একটি পরিবেশের পরিবর্তনশীল যা কিছু docker exec container /bin/bashসেশনের মাধ্যমে সেট করা হয়েছে ?

আমি করতে পারি docker exec container env | grep ENV_VAR, তবে আমি এমন কিছু পছন্দ করব যা কেবলমাত্র মানটি দেয় returns

আমি ব্যবহারের চেষ্টা করেছি docker exec container echo "$ENV_VAR", তবে প্রতিস্থাপনটি ধারকটির বাইরে ঘটতে পারে বলে মনে হচ্ছে, তাই আমি ধারক থেকে এনভিটি ভার্সনটি পাই না, বরং আমার নিজের কম্পিউটার থেকে এনভিটি বর্ণটি পাই।

ধন্যবাদ।


এনভি এবং গ্রেপ ব্যবহার না করা কেন এমন কোনও কারণ আছে?
আইসবাআ

আমার শুধু মান দরকার আমি যদি সঠিকভাবে বুঝতে পারি তবে আমাকে গ্রেপ কলের আউটপুট পার্স করতে হবে এবং আমি এটি এড়াতে চাই।
সিট্রোনেন

আমি ভেরিয়েবল ভেবেছিলাম যে একটি নির্বাহী অধিবেশন সেট করা প্রাথমিক প্রক্রিয়া বা পরবর্তী এক্সিকিউট সেশন প্রভাবিত করে না?
পল বেকোট

উত্তর:


136

ধারকটির echo "$ENV_VAR"ভিতরে চলার উপযুক্ত উপায় যাতে ধারকটিতে পরিবর্তনশীল প্রতিস্থাপনটি ঘটে:

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

4
লক্ষ্য করুন যে এই সমস্ত উত্তর কিছু শেলের উপর নির্ভর করে। আমি এক্সিকিউটেবল এবং স্ক্র্যাচ বেস চিত্র সহ এনভ ভেরিয়েবলগুলি পেতে সক্ষম নই।
রিচার্ড

docker run --rm -it CONTAINER bash -c 'echo "$MY_ENV_VAR"'
হেনরিক

আমি ত্রুটি পাচ্ছি "ত্রুটি: এ জাতীয় কোনও ধারক নেই: ধারক"। আমি এসএসএইচ-এর মাধ্যমে লগইন করার পরে কমান্ড কার্যকর করছি।
কুনওয়ার নীতেশ

1
@ কুনওয়ার্নিতেশ: আপনি যে ধারকটি চালাতে চান তার নামের সাথে আপনাকে "ধারক" প্রতিস্থাপন করতে হবে।
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বাইরে বিভিন্ন জিনিস থুতু। কেন?
সিট্রোনেন

আহ ... নির্দিষ্ট উপায়ে আমি ডকারের চিত্রটি তৈরি করছি যা এই
কেসটি তৈরি করে

2
এইচএম, এখন অনেক বেশি শক্ত। ব্যবহার করে দেখুন docker inspect container
আইসবাআ

docker inspect containerএকই সীমাবদ্ধতা আছে বলে মনে হচ্ছে। আমি কনটেইনারটি চালানোর পরে যদি পরিবেশের পরিবর্তনশীল তৈরি করি তবে এটি কোনও কল docker inspect(এনভিভি বিভাগে) তে উপস্থিত হবে না।
সিট্রোনেন

আমি বিশ্বাস করি এটি বর্তমানে গৃহীত উত্তরের চেয়ে উত্তম উত্তর। আমাদের কাছে বেশ কয়েকটি ধারক রয়েছে যা bashকমান্ড সহ সমর্থিত নয় alpine-node। সুতরাং ব্যবহার exec container bash -c "echo $ENV_VAR"কাজ করছে না। exec container envআমার ক্ষেত্রে কাজ করে । ব্যবহার exec container printenvকরেও কাজ করে।
রহমতগণ

78

আপনি printenv VARIABLEপরিবর্তে ব্যবহার করতে পারেন /bin/bash -c 'echo $VARIABLE। এটি অনেক সহজ এবং এটি প্রতিস্থাপন সম্পাদন করে না:

docker exec container printenv VARIABLE

7
এটি চূড়ান্ত উত্তর হওয়া উচিত
কি জাই

4
বা কেবল 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প্রয়োজনীয় আইটেমগুলিতে প্রতিটি এনভ ভার্ভেট আউটপুট দেয় , উদাহরণস্বরূপ, মাইএসকিএল ধারকটির সেটিংস এভাবে পুনরুদ্ধার করা যেতে পারে:

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খুব কাজ করে)


খুব সোজা! আমি এই পদ্ধতির জন্য স্থির।
ওপেনকো

বা কেবল printenvসমস্ত ভেরিয়েবল মুদ্রণ করতে।
নেক্সা

2

কোনো সুযোগ দ্বারা আপনাকে ব্যবহার করেন তাহলে VSCode এবং ইনস্টল করেছে Docker এক্সটেনশন শুধু right+ + clickDocker আপনি (মধ্যে চেক করতে চান তার উপর Docker এক্সটেনশন ), 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

এই কমান্ড হোস্টে ডকার স্ট্যাক প্রক্রিয়াগুলির পরিবেশ পরীক্ষা করে:

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

0

আমরা entrypointএকটি চলমান ধারক এর সাথে পরিবর্তন করতে পারিdocker runকমান্ডটি ।

PATH পরিবেশের পরিবর্তনশীল উদাহরণ উদাহরণ:

  1. ব্যবহার bashএবং echo: এই উত্তর দাবি করে যে echoকোনও আউটপুট উত্পাদন করবে না, যা ভুল।

    docker run --rm --entrypoint bash <container> -c 'echo "$PATH"'
  2. ব্যবহার printenv

    docker run --rm --entrypoint printenv <container> PATH
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.