আমি কীভাবে ডকার পাত্রে পরিবেশের পরিবর্তনশীলগুলি পাস করব?


825

আমি ডকারে নতুন, এবং ধারক থেকে কোনও বাহ্যিক ডাটাবেস কীভাবে অ্যাক্সেস করা যায় তা অস্পষ্ট। সংযোগের স্ট্রিং-এ হার্ড-কোডের সর্বোত্তম উপায়?

# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string

উত্তর:


1238

আপনি -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- তে প্রেরিত আর্গুমেন্টটিকে নকল করে। মন্তব্য লাইনগুলি কেবল # দিয়ে উপস্থাপিত হওয়া দরকার


এই কাজ করতে একটি সহজ উপায় আছে? প্রতিবার বিভিন্ন ভেরিয়েবলের সাথে ধারকটি পুনরায় তৈরি করা সত্যিই বিরক্তিকর। এটি একটি ফাইল এ সঞ্চয় করতে পারেন?
জেসন অ্যাক্সেলসন

29
আমি শেল স্ক্রিপ্টগুলিতে ডকার রান কমান্ডগুলি সঞ্চয় করি, (./start_stasing.sh ইত্যাদি ..) তারপরে সেগুলি উত্তরযোগ্য ব্যবহার করে দূরবর্তীভাবে চালিত করে।
এরাতটি

1
দ্বিতীয় সংস্করণটি কাজ করতে পেতে আমার সমস্যা হচ্ছে; আমি পরিবেশে PASSWORD = foo সেট করেছি, তারপরে --env পাসওয়ার্ডটি পাস করেছি এবং কেবলমাত্র "পাসওয়ার্ড" শব্দটি ধারকটির কনফিগারেশনটিতে প্রদর্শিত হয়েছে; প্রতিটি অন্যান্য পরিবেশের ভেরিয়েবলের একটি কী এবং একটি মান থাকে। আমি ডকার ব্যবহার করছি 1.12.1।
কেভিন বার্ক

@KevinBurke: আমার মনে হয় আপনি -e পাসওয়ার্ড চান = $ পাসওয়ার্ড আপনি বর্তমান শেল পরিবেশ থেকে পড়া হয়
ত্রুটি-বিচ্যুতি

8
@ কেভিন বার্ক: export PASSWORD=fooপরিবর্তে করুন এবং ভেরিয়েবলটি docker runপরিবেশের পরিবর্তনশীল হিসাবে তৈরি করা হবে, docker run -e PASSWORDকাজ করে making
কেরুব

93

আপনি এখানে কমান্ড -eসহ প্যারামিটার ব্যবহার করে পাস করতে পারবেন এখানেdocker run .. যেমন উল্লিখিত হয়েছে এবং @ ইরাতা উল্লেখ করেছেন।
তবে, এই পদ্ধতির সম্ভাব্য খারাপ দিকটি হ'ল আপনার শংসাপত্রগুলি প্রক্রিয়া তালিকাতে প্রদর্শিত হবে, যেখানে আপনি এটি চালান run
এটা আরো নিরাপদ করার জন্য, আপনাকে একটি কনফিগারেশন ফাইলের মধ্যে আপনার শংসাপত্রগুলি লিখতে এবং করতে পারে docker runসঙ্গে --env-fileযেমন উল্লেখ এখানে । তারপরে আপনি সেই কনফিগারেশন ফাইলটির অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন যাতে সেই মেশিনে অ্যাক্সেস থাকা অন্যরা আপনার শংসাপত্রগুলি না দেখে।


2
@ উদ্ভুত উত্তরের সাথে এই উদ্বেগের সমাধান করার জন্য আমি আরও একটি উপায় যুক্ত করেছি।
ব্রায়ান

21
সতর্কতা অবলম্বন করুন --env-file, আপনি যখন --envএনএনভি মানগুলি ব্যবহার করবেন তখন আপনি যে কোনও শেল ব্যবহার করছেন তার মানক শব্দার্থগুলি উদ্ধৃত / পলায়ন করা হবে, তবে মানগুলি ব্যবহার করার সময় আপনি আপনার ধারকটির অভ্যন্তরে পৃথক হয়ে উঠবেন --env-file। ডকার রান কমান্ড কেবল ফাইলটি পড়ে, খুব বেসিক পার্সিং করে এবং মানগুলি পাত্রে প্রবেশ করে, এটি আপনার শেল যেভাবে আচরণ করে তার সমতুল্য নয়। আপনি যদি একসাথে --envএন্ট্রিগুলির একগুচ্ছ রূপান্তর করছেন তবে সচেতন হওয়ার জন্য একটি ছোট্ট গোচা --env-file
কর্তিত

5
শর্ন উত্তরটি বিস্তারিতভাবে বোঝানোর জন্য, এনভী-ফাইলটি ব্যবহার করার সময়, আমাকে একটি দীর্ঘ পরিবেশের ভেরিয়েবলের মান এক লাইনে রেখে দিতে হয়েছিল, কারণ এতে কোনও লাইন বিরতি দেওয়ার, বা এটিকে ভাগ করার কোনও উপায় বলে মনে হচ্ছে না একাধিক লাইন যেমন: $ MY_VAR = স্টাফ $ MY_VAR = $ MY_VAR আরও স্টাফ
জেসন হোয়াইট

52

আপনি যদি নিজের ধারক (গুলি) স্পিন করার জন্য পদ্ধতি হিসাবে 'ডকার-কমপোজ' ব্যবহার করেন তবে আপনার সার্ভারে ডকারের ধারকটিতে পরিবেশিত পরিবর্তনগুলি নির্দিষ্ট করার জন্য একটি কার্যকর উপায় রয়েছে।

আপনার 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"

আমি আশা করি এটি আপনাকে আপনার ধারকটির যে কোনও ফাইলে একটি ডাটাবেস সংযুক্ত স্ট্রিংটিকে হার্ড-কোডিং এড়াতে সহায়তা করবে!


6
এটি কাজ করবে না। এই ভেরিয়েবলগুলি পাত্রে পাস করা হয় না।
ফ্রেন্ডর

@ ফ্রেন্ডর সত্যই? এই ডক্স অনুসারে এটি মনে হয় এটি করা উচিত।
দর্দা

1
এই পদ্ধতির সাথে সমস্যাটি হ'ল আপনি ডিকার-কমপোজ.আইএমএল ফাইলের পরিবেশগত পরিবর্তনগুলি গিট সংগ্রহস্থলের কাছে প্রতিশ্রুতিবদ্ধ যা আপনার উচিত নয়। আপনি কিভাবে এই কাছাকাছি যেতে না? আদর্শভাবে আপনার একটি পৃথক এনভিলিও ফাইল থাকতে পারে যা গিটিংগর্ড রয়েছে এবং ডকফায়িল বা ডকার-কমপোজ.আইএমএলে আমদানি / লোড করতে পারে
খালেদ ওসমান

35

ব্যবহার করে 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

তাদের কি একই নাম হতে হবে? মনে হচ্ছে বিভ্রান্তিমূলক .. এবং আমি যদি এর পরিবর্তে উন্নয়ন চালাতে চাই তবে কীভাবে আমি আরগগুলি ওভাররাইড করব?
সাইবারমিউ

@ সাইবারমিউ হ্যাঁ আপনার পরিবেশ, ডকার-রচনা এবং ডকফায়াইলের মধ্যে তাদের একই নাম থাকতে হবে। আপনি যদি এর পরিবর্তে উন্নয়ন চালাতে চান, ডকার-কমপেজ বিল্ড চালানোর আগে, পরিবেশের পরিবর্তনশীল সেট করতে আপনার টার্মিনালে RAILS_ENV = বিকাশ চালান, সেইভাবে ডকার-কমপোজ এবং ফলস্বরূপ ডকফায়াইল আপনার পরিবেশ থেকে সেই মানটি উত্তরাধিকার সূত্রে প্রাপ্ত হবে।
জোশওয়ায়ার

30

-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/


2
আমাদের দরকার কেন ubuntu bash? এটি কি উবুন্টু দিয়ে তৈরি চিত্রগুলি বেস ইমেজ হিসাবে বা প্রতিটি চিত্রের জন্য প্রযোজ্য?
রেয়ানশ খড়গা

আমি ইচ্ছা করি -eযুগে যুগে যুক্তির পরে ধারকটির নাম রাখার বিষয়ে কিছুটা পড়তাম ! তারা কেন এটি প্রয়োজনীয় করেছে তা আমি বুঝতেও শুরু করতে পারি না ...

13

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

env > env_file && docker run --env-file env_file image_name

এই কৌশলটি খুব সাবধানতার সাথে ব্যবহার করুন, কারণ সমস্ত হোস্ট মেশিন ENV ভেরিয়েবলগুলিকে env > env_fileডাম্প করবে এবং চলমান ধারকটিতে তাদের অ্যাক্সেসযোগ্য করে তুলবে।env_file


5

অ্যামাজন এডাব্লুএস ইসিএস / ইসিআর এর জন্য আপনার ব্যক্তিগত পরিবেশের ভেরিয়েবলগুলি ( বিশেষত সিক্রেটস ) একটি ব্যক্তিগত এস 3 বালতির মাধ্যমে পরিচালনা করা উচিত । অ্যামাজন এসসি এবং ডকার ব্যবহার করে অ্যামাজন ইসি 2 কনটেইনার পরিষেবা – ভিত্তিক অ্যাপ্লিকেশনগুলির গোপনীয়তাগুলি কীভাবে পরিচালনা করবেন তা ব্লগ পোস্ট দেখুন ।


বা এসএসএম প্যারামিটার স্টোর
জোশওয়েয়ার

5

এর আরেকটি উপায় হ'ল এর ক্ষমতাগুলি ব্যবহার করা /usr/bin/env:

docker run ubuntu env DEBUG=1 path/to/script.sh

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প্রকৃত উত্স কমান্ডটি কাজ করে তা পরীক্ষা করার জন্য কমান্ডটি যুক্ত করেছি । আপনি যখন সোর্স কমান্ডটি ঠিকঠাক কাজ করেছে বা পরিবেশের ভেরিয়েবলগুলি আপনার ডকার লগগুলিতে উপস্থিত হবে তা নিশ্চিত করার সময় আপনার সম্ভবত এটি অপসারণ করা উচিত।


2
এই পদ্ধতির সাথে প্রতিবার আপনি বিভিন্ন / পরিবর্তিত এনভি সেটটি পাস করতে চাইলে আপনাকে আপনাকে ডকারের চিত্র পুনর্নির্মাণ করতে হবে। "ডকার --আরুন --env-file ./somefile.txt" চলাকালীন envs পাস করা উচ্চতর / গতিশীল পদ্ধতির।
দিমিত্রি শেভকপলিয়াস

2
@ দিমিত্রি শেভকপলিয়াস আমি একমত আমার ব্যবহারের --env-fileক্ষেত্রটি হ'ল যেখানে কোনও docker runআদেশকে আর্গ নির্দিষ্ট করার বিকল্প নেই । উদাহরণস্বরূপ, আপনি যদি গুগল অ্যাপ ইঞ্জিন ব্যবহার করে কোনও অ্যাপ্লিকেশন স্থাপন করছেন এবং কনটেইনারটিতে চলমান অ্যাপটির জন্য পরিবেশক ভেরিয়েবলগুলি ডকারের ধারকের ভিতরে সেট করা দরকার, আপনার docker runকমান্ডের নিয়ন্ত্রণ না থাকায় আপনার পরিবেশের ভেরিয়েবলগুলি সেট করার জন্য সরাসরি পন্থা নেই you । এই জাতীয় ক্ষেত্রে, আপনার কাছে একটি স্ক্রিপ্ট থাকতে পারে যা এনভি ভেরিয়েবলগুলি ডিক্রিপ্ট করে কেএমএস বলুন এবং সেগুলিতে যুক্ত করুন env.shযা এনভ ভেরিয়েবলগুলি সেট করার জন্য উত্সাহিত করা যেতে পারে।
আকলেশ রাজ

আপনি এর পরিবর্তে .নিয়মিত পসিক্স (ডট) কমান্ড ব্যবহার করতে পারেন । ( হিসাবে একই )shsourcesource.
go2null

1

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পরিবর্তনশীল এটি তৈরি করে না।
পার্পলেক্সাবোট

0

আমরা -e পতাকা এবং using ব্যবহার করে আপনি মেশিন এনভায়রনমেন্ট ভেরিয়েবল হোস্ট করতে পারেন:

চলমান আগে রফতানি করা প্রয়োজন (মানে সেট) স্থানীয় env ভেরিয়েবল এবং ফাইল বা ব্যবহারের ঠিক আগে

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')

0

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 <(বাশ-সি 'এনভি | গ্রেপ এডাব্লুএস_') দিয়ে ডকার চালানো এগুলি সবই ধরে ফেলবে এবং ধারকটির মধ্যে থেকে অ্যাক্সেসযোগ্য হওয়ার জন্য এটি নিরাপদে পাস করবে।

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