जवाबों:
आप -e
ध्वज के साथ अपने कंटेनरों में पर्यावरण चर पास कर सकते हैं ।
स्टार्टअप स्क्रिप्ट से एक उदाहरण:
sudo docker run -d -t -i -e REDIS_NAMESPACE='staging' \
-e POSTGRES_ENV_POSTGRES_PASSWORD='foo' \
-e POSTGRES_ENV_POSTGRES_USER='bar' \
-e POSTGRES_ENV_DB_NAME='mysite_staging' \
-e POSTGRES_PORT_5432_TCP_ADDR='docker-db-1.hidden.us-east-1.rds.amazonaws.com' \
-e SITE_URL='staging.mysite.com' \
-p 80:80 \
--link redis:redis \
--name container_name dockerhub_id/image_name
या, यदि आप कमांड-लाइन पर मान नहीं रखना चाहते हैं जहां यह प्रदर्शित किया जाएगा ps
, आदि, -e
तो वर्तमान वातावरण से मूल्य में खींच सकते हैं यदि आप इसे बिना देते हैं =
:
sudo PASSWORD='foo' docker run [...] -e PASSWORD [...]
यदि आपके पास कई पर्यावरण चर हैं और विशेष रूप से यदि वे गुप्त होने के लिए हैं, तो आप एक एनवी-फाइल का उपयोग कर सकते हैं :
$ docker run --env-file ./env.list ubuntu bash
--Env- फाइल फ्लैग को एक तर्क के रूप में फाइलनाम लेता है और प्रत्येक लाइन को VAR = VAL फॉर्मेट में होने की उम्मीद करता है, जो तर्क --env को दिए गए की नकल करता है। टिप्पणी लाइनों को केवल # के साथ उपसर्ग करने की आवश्यकता है
export PASSWORD=foo
इसके बजाय और चर docker run
को एक पर्यावरण चर के रूप में पारित किया जाएगा , जिससे docker run -e PASSWORD
काम बन जाएगा।
आप यहां बताए अनुसार @ पैराटाटा के अनुसार कमांड के -e
साथ पैरामीटर्स का इस्तेमाल कर सकते हैं ।
हालांकि, इस दृष्टिकोण का संभावित नकारात्मक पक्ष यह है कि आपके क्रेडेंशियल्स को प्रक्रिया सूची में प्रदर्शित किया जाएगा, जहां आप इसे चलाते हैं।
यह अधिक सुरक्षित बनाने के लिए, आप एक विन्यास फाइल में आपके क्रेडेंशियल्स लिख सकते हैं और ऐसा कर सकते हैं के साथ के रूप में उल्लेख यहाँ । फिर आप उस कॉन्फिग फाइल की पहुंच को नियंत्रित कर सकते हैं ताकि दूसरों को उस मशीन तक पहुंचने में आपकी साख न दिखे।docker run ..
docker run
--env-file
--env-file
, जब आप --env
अपने env मानों का उपयोग करते हैं , तो आप जो भी शेल उपयोग कर रहे हैं, उसके मानक शब्दार्थों के साथ उद्धृत / बच जाएंगे, लेकिन जब --env-file
आप अपने कंटेनर के अंदर प्राप्त मानों का उपयोग करेंगे तो अलग होगा। डॉक रन कमांड सिर्फ फ़ाइल को पढ़ता है, बहुत ही बुनियादी पार्सिंग करता है और कंटेनर के माध्यम से मूल्यों को पारित करता है, यह आपके शेल के व्यवहार के तरीके के बराबर नहीं है। अगर आप --env
प्रविष्टियों का एक गुच्छा एक करने के लिए परिवर्तित कर रहे हैं बस के बारे में पता करने के लिए एक छोटा सा गोचा --env-file
।
यदि आप अपने कंटेनर (एस) को स्पिन करने की विधि के रूप में 'डॉकटर-कंपोज' का उपयोग कर रहे हैं, तो डॉकटर कंटेनर में आपके सर्वर पर परिभाषित पर्यावरण चर को पास करने का एक उपयोगी तरीका है।
अपनी docker-compose.yml
फ़ाइल में, मान लें कि आप एक बुनियादी हपी-जेएस कंटेनर को स्पिन कर रहे हैं और कोड इस तरह दिखता है:
hapi_server:
container_name: hapi_server
image: node_image
expose:
- "3000"
मान लीजिए कि आपका डॉकटर प्रोजेक्ट जिस स्थानीय सर्वर पर है, उसमें 'NODE_DB_CONNECT' नाम का एक पर्यावरण चर है जिसे आप अपने hapi-js कंटेनर में पास करना चाहते हैं, और आप इसका नया नाम 'HAPI -DB_CONNECT' चाहते हैं। फिर docker-compose.yml
फ़ाइल में, आप स्थानीय पर्यावरण चर को कंटेनर में डालेंगे और उसका नाम बदलेंगे:
hapi_server:
container_name: hapi_server
image: node_image
environment:
- HAPI_DB_CONNECT=${NODE_DB_CONNECT}
expose:
- "3000"
मुझे आशा है कि यह आपके कंटेनर में किसी भी फ़ाइल में डेटाबेस कनेक्ट स्ट्रिंग को हार्ड-कोडिंग से बचने में आपकी मदद करता है!
उपयोग करते हुए docker-compose
, आप docker-compose.yml में env चर विरासत में पा सकते हैं और बाद में docker-compose
छवियों का निर्माण करने के लिए किसी भी Dockerfile (s) को बुलाया जा सकता है । यह तब उपयोगी होता है जब Dockerfile
RUN
कमांड को पर्यावरण के लिए विशिष्ट कमांड निष्पादित करनी चाहिए।
(आपका खोल है RAILS_ENV=development
पर्यावरण में पहले से मौजूद है)
docker-compose.yml :
version: '3.1'
services:
my-service:
build:
#$RAILS_ENV is referencing the shell environment RAILS_ENV variable
#and passing it to the Dockerfile ARG RAILS_ENV
#the syntax below ensures that the RAILS_ENV arg will default to
#production if empty.
#note that is dockerfile: is not specified it assumes file name: Dockerfile
context: .
args:
- RAILS_ENV=${RAILS_ENV:-production}
environment:
- RAILS_ENV=${RAILS_ENV:-production}
Dockerfile :
FROM ruby:2.3.4
#give ARG RAILS_ENV a default value = production
ARG RAILS_ENV=production
#assign the $RAILS_ENV arg to the RAILS_ENV ENV so that it can be accessed
#by the subsequent RUN call within the container
ENV RAILS_ENV $RAILS_ENV
#the subsequent RUN call accesses the RAILS_ENV ENV variable within the container
RUN if [ "$RAILS_ENV" = "production" ] ; then echo "production env"; else echo "non-production env: $RAILS_ENV"; fi
इस तरह से मैं न फाइल या में वातावरण चर निर्दिष्ट करने के लिए की जरूरत है docker-compose
build
/ up
कमांड:
docker-compose build
docker-compose up
उपयोग -e
पर्यावरण चर (डिफ़ॉल्ट []] सेट करने के लिए या --env मान का ।
स्टार्टअप स्क्रिप्ट से एक उदाहरण:
docker run -e myhost='localhost' -it busybox sh
यदि आप कमांड लाइन से कई वातावरणों का उपयोग करना चाहते हैं तो प्रत्येक पर्यावरण चर का उपयोग करने से पहले -e
ध्वज का ।
उदाहरण:
sudo docker run -d -t -i -e NAMESPACE='staging' -e PASSWORD='foo' busybox sh
नोट: सुनिश्चित करें कि कंटेनर का नाम पर्यावरण चर के बाद रखा जाए, उससे पहले नहीं।
यदि आपको कई चर सेट करने की आवश्यकता है, तो उपयोग करें --env-file
ध्वज का
उदाहरण के लिए,
$ docker run --env-file ./my_env ubuntu bash
किसी अन्य सहायता के लिए, डॉकर सहायता देखें:
$ docker run --help
आधिकारिक दस्तावेज: https://docs.docker.com/compose/environment-variables/
ubuntu bash
? क्या यह आधार छवि या हर छवि के रूप में ubuntu के साथ बनाई गई छवियों के लिए लागू होता है?
-e
तर्कों के युग के बाद कंटेनर नाम रखने के बारे में थोड़ा पढ़ता ! मुझे यह भी समझ में नहीं आ रहा है कि उन्होंने यह आवश्यक क्यों बनाया ...
एक डॉक कंटेनर में होस्ट मशीन पर्यावरण चर को पाइप करने के लिए एक अच्छा हैक है:
env > env_file && docker run --env-file env_file image_name
इस तकनीक का उपयोग बहुत सावधानी से करें, क्योंकि सभी होस्ट मशीन ENV चर को
env > env_file
डंप करेंगे और उन्हें रनिंग कंटेनर में पहुंच योग्य बनाएंगे।env_file
अमेज़ॅन एडब्ल्यूएस ईसीएस / ईसीआर के लिए, आपको निजी एस 3 बाल्टी के माध्यम से अपने पर्यावरण चर ( विशेष रूप से रहस्य ) का प्रबंधन करना चाहिए । Amazon S3 और Docker का उपयोग करके अमेज़ॅन EC2 कंटेनर सेवा-आधारित अनुप्रयोगों के लिए गोपनीयता का प्रबंधन कैसे करें के बारे में ब्लॉग पोस्ट देखें ।
यदि आपके पास env.sh
स्थानीय रूप से पर्यावरण चर हैं और कंटेनर शुरू होने पर इसे स्थापित करना चाहते हैं, तो आप कोशिश कर सकते हैं
COPY env.sh /env.sh
COPY <filename>.jar /<filename>.jar
ENTRYPOINT ["/bin/bash" , "-c", "source /env.sh && printenv && java -jar /<filename>.jar"]
यह कमांड कंटेनर को एक बैश शेल के साथ शुरू करेगा (मुझे एक बैश शेल चाहिए क्योंकि source
एक बैश कमांड है), env.sh
फाइल को स्रोत करता है (जो पर्यावरण चर को सेट करता है) और जार फाइल को निष्पादित करता है।
इस env.sh
तरह दिखता है,
#!/bin/bash
export FOO="BAR"
export DB_NAME="DATABASE_NAME"
मैंने printenv
केवल वास्तविक स्रोत कमांड काम करने के लिए कमांड को जोड़ा । स्रोत कमांड के ठीक काम करने की पुष्टि करने पर आपको इसे हटा देना चाहिए या पर्यावरण चर आपके डॉक लॉग में दिखाई देगा।
--env-file
arg को निर्दिष्ट करने का कोई विकल्प नहीं है docker run
। उदाहरण के लिए, यदि आप Google एप्लिकेशन इंजन का उपयोग करके एक एप्लिकेशन को तैनात कर रहे हैं और कंटेनर के अंदर चल रहे ऐप को डॉकटर कंटेनर के अंदर पर्यावरण चर की जरूरत है, तो आपके पास पर्यावरण चर सेट करने के लिए एक सीधा दृष्टिकोण नहीं है क्योंकि आपके पास docker run
कमांड पर नियंत्रण नहीं है। । ऐसी स्थिति में, आपके पास एक स्क्रिप्ट हो सकती है, जो कहती है, KMS का उपयोग करके env वेरिएबल्स को डिक्रिप्ट करता है, और उन्हें जोड़ता है, env.sh
जिसे env वेरिएबल्स को सेट करने के लिए सॉरी किया जा सकता है।
.
नियमित रूप से उपलब्ध POSIX (डॉट) कमांड का उपयोग कर सकते हैं । ( जैसा है )sh
source
source
.
JSON के एनवी को बदलने के लिए jq का उपयोग करना:
env_as_json=`jq -c -n env`
docker run -e HOST_ENV="$env_as_json" <image>
इसके लिए jq संस्करण 1.6 या नए की आवश्यकता है
इस मेजबान को ईर्ष्या के रूप में जोर से मारना, अनिवार्य रूप से डॉकरफाइल में ऐसा है:
ENV HOST_ENV (all env from the host as json)
docker run -e HOST_ENV="$env_as_json" <image>
?: मेरे मामले में डॉकर्स वैरिएबल के रूप में पारित होने पर चर या उपधारा ( ${}
या $()
) को हल करता प्रतीत नहीं होता है । उदाहरण के लिए: A=123 docker run --rm -it -e HE="$A" ubuntu
फिर उस कंटेनर के अंदर: root@947c89c79397:/# echo $HE root@947c89c79397:/#
.... HE
चर इसे नहीं बनाता है।
हम भी -E झंडा और $ का उपयोग करके मशीन पर्यावरण चर की मेजबानी कर सकते हैं:
docker run -it -e MG_HOST=$MG_HOST -e MG_USER=$MG_USER -e MG_PASS=$MG_PASS -e MG_AUTH=$MG_AUTH -e MG_DB=$MG_DB -t image_tag_name_and_version
मेरे मामले में आपके दिए गए नाम (MG_HOST, MG_USER) के साथ स्वचालित रूप से इस चर सेट का प्रयोग करके
यदि आप अजगर का उपयोग कर रहे हैं तो आप इन एनकरमेंट वैरिएबल को डॉकटर के द्वारा एक्सेस कर सकते हैं
import os
host,username,password,auth,database=os.environ.get('MG_HOST'),os.environ.get('MG_USER'),os.environ.get('MG_PASS'),os.environ.get('MG_AUTH'),os.environ.get('MG_DB')
docker run --rm -it --env-file <(bash -c 'env | grep <your env data>')
एक तरीका है जो डेटा को एक में संग्रहीत करता है .env
और उन्हें डॉकर के पास भेज देता है, बिना कुछ भी असुरक्षित तरीके से संग्रहीत किया जाता है (इसलिए आप केवल docker history
कुंजियों को नहीं देख सकते हैं और न ही पकड़ सकते हैं।
कहो कि आपके पास अपनी .env
तरह AWS सामान का भार है :
AWS_ACCESS_KEY: xxxxxxx
AWS_SECRET: xxxxxx
AWS_REGION: xxxxxx
`do do run-rm -it --env-file <(bash -c 'env | grep AWS_') के साथ रनिंग डॉक इसे सभी को पकड़कर कंटेनर के भीतर से एक्सेस करने के लिए सुरक्षित रूप से पास करेगा।