উত্তর:
আপনি -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-file পতাকাটি আর্গুমেন্ট হিসাবে একটি ফাইলের নাম নেয় এবং প্রতিটি লাইনটি VAR = VAL ফর্ম্যাটে থাকবে বলে আশা করে --env- তে প্রেরিত আর্গুমেন্টটিকে নকল করে। মন্তব্য লাইনগুলি কেবল # দিয়ে উপস্থাপিত হওয়া দরকার
export PASSWORD=fooপরিবর্তে করুন এবং ভেরিয়েবলটি docker runপরিবেশের পরিবর্তনশীল হিসাবে তৈরি করা হবে, docker run -e PASSWORDকাজ করে making
আপনি এখানে কমান্ড -eসহ প্যারামিটার ব্যবহার করে পাস করতে পারবেন এখানেdocker run .. যেমন উল্লিখিত হয়েছে এবং @ ইরাতা উল্লেখ করেছেন।
তবে, এই পদ্ধতির সম্ভাব্য খারাপ দিকটি হ'ল আপনার শংসাপত্রগুলি প্রক্রিয়া তালিকাতে প্রদর্শিত হবে, যেখানে আপনি এটি চালান run
এটা আরো নিরাপদ করার জন্য, আপনাকে একটি কনফিগারেশন ফাইলের মধ্যে আপনার শংসাপত্রগুলি লিখতে এবং করতে পারে docker runসঙ্গে --env-fileযেমন উল্লেখ এখানে । তারপরে আপনি সেই কনফিগারেশন ফাইলটির অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন যাতে সেই মেশিনে অ্যাক্সেস থাকা অন্যরা আপনার শংসাপত্রগুলি না দেখে।
--env-file, আপনি যখন --envএনএনভি মানগুলি ব্যবহার করবেন তখন আপনি যে কোনও শেল ব্যবহার করছেন তার মানক শব্দার্থগুলি উদ্ধৃত / পলায়ন করা হবে, তবে মানগুলি ব্যবহার করার সময় আপনি আপনার ধারকটির অভ্যন্তরে পৃথক হয়ে উঠবেন --env-file। ডকার রান কমান্ড কেবল ফাইলটি পড়ে, খুব বেসিক পার্সিং করে এবং মানগুলি পাত্রে প্রবেশ করে, এটি আপনার শেল যেভাবে আচরণ করে তার সমতুল্য নয়। আপনি যদি একসাথে --envএন্ট্রিগুলির একগুচ্ছ রূপান্তর করছেন তবে সচেতন হওয়ার জন্য একটি ছোট্ট গোচা --env-file।
আপনি যদি নিজের ধারক (গুলি) স্পিন করার জন্য পদ্ধতি হিসাবে 'ডকার-কমপোজ' ব্যবহার করেন তবে আপনার সার্ভারে ডকারের ধারকটিতে পরিবেশিত পরিবর্তনগুলি নির্দিষ্ট করার জন্য একটি কার্যকর উপায় রয়েছে।
আপনার docker-compose.ymlফাইলে, ধরা যাক যে আপনি একটি বেসিক হাপি-জেএস ধারকটি কাটছেন এবং কোডটি দেখতে দেখতে এমন:
hapi_server:
container_name: hapi_server
image: node_image
expose:
- "3000"
ধরা যাক যে স্থানীয় সার্ভারে আপনার ডকার প্রজেক্টটি চালু রয়েছে এমন একটি এনভায়রনমেন্ট ভেরিয়েবল রয়েছে যার নাম 'NODE_DB_CONNECT' রয়েছে যা আপনি নিজের হ্যাপি-জেএস কনটেইনারটিতে যেতে চান এবং আপনি এর নতুন নামটি '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চিত্রগুলি তৈরির জন্য ডেকে নেওয়া কোনও ডকফেরাইল (গুলি) এর env ভেরিয়েবলের উত্তরাধিকারী হতে পারেন । Dockerfile RUNকমান্ডটি পরিবেশ সম্পর্কিত নির্দিষ্ট কমান্ড প্রয়োগ করতে পারে এটি কার্যকর হয়।
(আপনার শেলটি RAILS_ENV=developmentইতিমধ্যে পরিবেশে বিদ্যমান রয়েছে)
ডকার-কম্পোজ.আইএমএল :
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}
ডকফেরাইল :
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
দ্রষ্টব্য: কনটেইনারটির নাম পরিবেশ পরিবর্তনের পরে রাখা উচিত, তার আগে নয় Make
আপনার যদি অনেকগুলি ভেরিয়েবল সেটআপ করতে হয় তবে --env-fileপতাকাটি ব্যবহার করুন
উদাহরণ স্বরূপ,
$ docker run --env-file ./my_env ubuntu bash
অন্য কোনও সহায়তার জন্য ডকার সহায়তাটি দেখুন:
$ docker run --help
অফিসিয়াল ডকুমেন্টেশন: https://docs.docker.com/compose/en वातावरण- variables/
ubuntu bash? এটি কি উবুন্টু দিয়ে তৈরি চিত্রগুলি বেস ইমেজ হিসাবে বা প্রতিটি চিত্রের জন্য প্রযোজ্য?
-eযুগে যুগে যুক্তির পরে ধারকটির নাম রাখার বিষয়ে কিছুটা পড়তাম ! তারা কেন এটি প্রয়োজনীয় করেছে তা আমি বুঝতেও শুরু করতে পারি না ...
হোকার মেশিন এনভায়রনমেন্ট ভেরিয়েবলগুলি ডকার পাত্রে কীভাবে পাইপ করা যায় তা একটি দুর্দান্ত হ্যাক রয়েছে:
env > env_file && docker run --env-file env_file image_name
এই কৌশলটি খুব সাবধানতার সাথে ব্যবহার করুন, কারণ সমস্ত হোস্ট মেশিন ENV ভেরিয়েবলগুলিকে
env > env_fileডাম্প করবে এবং চলমান ধারকটিতে তাদের অ্যাক্সেসযোগ্য করে তুলবে।env_file
অ্যামাজন এডাব্লুএস ইসিএস / ইসিআর এর জন্য আপনার ব্যক্তিগত পরিবেশের ভেরিয়েবলগুলি ( বিশেষত সিক্রেটস ) একটি ব্যক্তিগত এস 3 বালতির মাধ্যমে পরিচালনা করা উচিত । অ্যামাজন এসসি এবং ডকার ব্যবহার করে অ্যামাজন ইসি 2 কনটেইনার পরিষেবা – ভিত্তিক অ্যাপ্লিকেশনগুলির গোপনীয়তাগুলি কীভাবে পরিচালনা করবেন তা ব্লগ পোস্ট দেখুন ।
আপনার যদি 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ক্ষেত্রটি হ'ল যেখানে কোনও docker runআদেশকে আর্গ নির্দিষ্ট করার বিকল্প নেই । উদাহরণস্বরূপ, আপনি যদি গুগল অ্যাপ ইঞ্জিন ব্যবহার করে কোনও অ্যাপ্লিকেশন স্থাপন করছেন এবং কনটেইনারটিতে চলমান অ্যাপটির জন্য পরিবেশক ভেরিয়েবলগুলি ডকারের ধারকের ভিতরে সেট করা দরকার, আপনার docker runকমান্ডের নিয়ন্ত্রণ না থাকায় আপনার পরিবেশের ভেরিয়েবলগুলি সেট করার জন্য সরাসরি পন্থা নেই you । এই জাতীয় ক্ষেত্রে, আপনার কাছে একটি স্ক্রিপ্ট থাকতে পারে যা এনভি ভেরিয়েবলগুলি ডিক্রিপ্ট করে কেএমএস বলুন এবং সেগুলিতে যুক্ত করুন env.shযা এনভ ভেরিয়েবলগুলি সেট করার জন্য উত্সাহিত করা যেতে পারে।
.নিয়মিত পসিক্স (ডট) কমান্ড ব্যবহার করতে পারেন । ( হিসাবে একই )shsourcesource.
Env কে JSON এ রূপান্তর করতে jq ব্যবহার করে:
env_as_json=`jq -c -n env`
docker run -e HOST_ENV="$env_as_json" <image>
এর জন্য জেকিউ সংস্করণ 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 পতাকা এবং using ব্যবহার করে আপনি মেশিন এনভায়রনমেন্ট ভেরিয়েবল হোস্ট করতে পারেন:
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)
আপনি যদি অজগর ব্যবহার করে থাকেন তবে ডকারের অভ্যন্তরে এই envment পরিবর্তনশীলটি অ্যাক্সেস করতে পারেন
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_ACCESS_KEY: xxxxxxx
AWS_SECRET: xxxxxx
AWS_REGION: xxxxxx
`` `ডকার রান --rm -it --env-file <(বাশ-সি 'এনভি | গ্রেপ এডাব্লুএস_') দিয়ে ডকার চালানো এগুলি সবই ধরে ফেলবে এবং ধারকটির মধ্যে থেকে অ্যাক্সেসযোগ্য হওয়ার জন্য এটি নিরাপদে পাস করবে।