ডকার রচনায় পরিবেশের পরিবর্তনশীল কীভাবে ব্যবহার করবেন


217

আমি ডকার-কমপোজ.আইএমএল-এর ভিতরে এনভ ভেরিয়েবলগুলি ব্যবহার করতে সক্ষম হতে চাই, ডকার-কমপোজ করার সময় পাস করা মানগুলি সহ। এটি উদাহরণ। আমি আজ এটি বেসিক ডকার রান কমান্ড দিয়ে করছি, যা আমার নিজের স্ক্রিপ্টের চারপাশে মোড়ানো। এরকম কোনও ব্যাশের মোড়ক ছাড়াই এটি রচনার কোনও উপায় কী?

proxy:
  hostname: $hostname
  volumes:
    - /mnt/data/logs/$hostname:/logs
    - /mnt/data/$hostname:/data

2
বিভিন্ন বিকল্পের জন্য দেখুন: ডকস.ডকার
কমপোজ / পরিবেশ-

2
এটি রচনাটির শেষ সংস্করণে সমাধান হয়েছে, আপনার উদাহরণ ঠিক যেমন কাজ করবে। ভেরিয়েবল প্রতিস্থাপন সম্পর্কে ডকস.ডকার.কম্পোজ / কমপোজ- ফাইল /# ভার্ভেবল-সাবস্কিটিউশন পরীক্ষা করুন ।
নাটবুসা

1
: (জুন 2018 সাল থেকে) Docker-অ্যাপ ভুলবেন না stackoverflow.com/a/51007138/6309
VonC

উত্তর:


93
  1. একটি তৈরি করুন template.yml, যা আপনার docker-compose.ymlপরিবেশগত পরিবর্তনশীল সহ।
  2. মনে করুন আপনার পরিবেশের ভেরিয়েবলগুলি একটি ফাইল 'env.sh' এ রয়েছে
  3. নীচের কোডটির টুকরোটি একটি sh ফাইলে রাখুন এবং এটি চালান।

উত্স env.sh; rm -rf ডকার-কমপোজ.আইএমএল; envsubst <"টেম্পলেট.আইএমএল"> "ডকার-কম্পোজ.আইএমএল";

docker-compose.ymlপরিবেশের ভেরিয়েবলের সঠিক মান সহ একটি নতুন ফাইল তৈরি করা হবে।

নমুনা টেমপ্লেট.আইএমএল ফাইল:

oracledb:
        image: ${ORACLE_DB_IMAGE}
        privileged: true
        cpuset: "0"
        ports:
                - "${ORACLE_DB_PORT}:${ORACLE_DB_PORT}"
        command: /bin/sh -c "chmod 777 /tmp/start; /tmp/start"
        container_name: ${ORACLE_DB_CONTAINER_NAME}

নমুনা env.sh ফাইল:

#!/bin/bash 
export ORACLE_DB_IMAGE=<image-name> 
export ORACLE_DB_PORT=<port to be exposed> 
export ORACLE_DB_CONTAINER_NAME=ORACLE_DB_SERVER

@ মিট "বেস সলিউশন" এর অধীনে আমার উত্তর নমুনা পরীক্ষা করতে নির্দ্বিধায় অনুভব করুন যেখানে আমি এই পদ্ধতির কিছুটা আরও পুঙ্খানুপুঙ্খ রূপরেখা দিচ্ছি।
modulitos

7
এই মুহুর্তে এখনও এর চেয়ে ভাল সমাধান আর নেই?
lvthillo

13
আপনি কেন পুনরাবৃত্তভাবে একটি ফাইল মুছবেন? (আরএম-আরএফ ডকার-কমপোজ.আইএমএল)
মরিৎস্চেফার

: @ lorenzvth7 আপনি নীচের আমার উত্তর, যা আমি মনে করি একটু বেশি পুঙ্খানুপুঙ্খ হয় চেক আউট করতে পারেন stackoverflow.com/a/33186458/1884158
modulitos

5
-1 এই সমাধান শুধুমাত্র জিনিষ complicates এবং Docker-রচনা নতুন ক্ষমতা অনুযায়ী আপডেট করা উচিত docs.docker.com/compose/environment-variables/...
Efrat Levitan

240

ডকার সমাধান:

দেখে মনে হচ্ছে ডকার-কমপোজ 1.5++ ভেরিয়েবল প্রতিস্থাপন সক্ষম করেছে: https://github.com/docker/compose/reLives

সর্বশেষতম ডকার রচনা আপনাকে আপনার রচনা ফাইল থেকে পরিবেশের পরিবর্তনগুলি অ্যাক্সেস করতে দেয়। সুতরাং আপনি আপনার পরিবেশের ভেরিয়েবলগুলি উত্স করতে পারেন, তারপরে এভাবে রচনা করুন:

set -a
source .my-env
docker-compose up -d

তারপরে আপনি ডকার-কমপোজ.মিলের মধ্যে ভেরিয়েবলগুলি $ AR ভারিয়েবল using ব্যবহার করে উল্লেখ করতে পারেন:

db:
  image: "postgres:${POSTGRES_VERSION}"

এবং এখানে ডক্স থেকে আরও তথ্য এখানে নেওয়া হয়েছে: https://docs.docker.com/compose/compose-file/#variable-substistance

আপনি যখন এই কনফিগারেশনটির সাথে ডকার-রচনাটি চালান, তখন রচনাটি শেলটির মধ্যে POSTGRES_VERSION পরিবেশের পরিবর্তনশীল সন্ধান করে এবং এর মানটিকে প্রতিস্থাপিত করে this উদাহরণস্বরূপ, রচনাটি কনফিগারেশনটি চালানোর আগে চিত্রটিকে পোস্টগ্র্যাগ: 9.3 এ সমাধান করে।

যদি পরিবেশের পরিবর্তনশীল সেট না করা থাকে তবে একটি ফাঁকা স্ট্রিং সহ বিকল্পগুলি রচনা করুন। উপরের উদাহরণে, যদি POSTGRES_VERSION সেট না করা থাকে তবে চিত্র বিকল্পের মানটি পোস্টগ্রিজ:।

উভয় AR ভেরিয়েবল এবং $ AR ভারিবেল} বাক্য গঠন সমর্থিত। Shell AR ভারিএবল-ডিফল্ট as এবং $ AR ভার্শিয়াল / ফু / বার as এর মতো প্রসারিত শেল-স্টাইল বৈশিষ্ট্যগুলি সমর্থিত নয়।

আপনার যদি কনফিগারেশনের মানটিতে আক্ষরিক ডলার সাইন লাগাতে হয় তবে একটি ডাবল ডলার চিহ্ন ($$) ব্যবহার করুন।

এবং আমি বিশ্বাস করি যে এই বৈশিষ্ট্যটি এই টানার অনুরোধে যুক্ত করা হয়েছিল: https://github.com/docker/compose/pull/1765

বেস সমাধান:

আমি লক্ষ্য করেছি যে ডকের পরিবেশগত ভেরিয়েবল সমর্থন নিয়ে লোকদের সমস্যা রয়েছে। ডকারে এনভায়রনমেন্ট ভেরিয়েবলের সাথে ডিল করার পরিবর্তে, বাশের মতো বেসিকগুলিতে ফিরে যাই! এখানে ব্যাশ স্ক্রিপ্ট এবং একটি .envফাইল ব্যবহার করে আরও নমনীয় পদ্ধতি ।

.Env ফাইলের একটি উদাহরণ:

EXAMPLE_URL=http://example.com
# Note that the variable below is commented out and will not be used:
# EXAMPLE_URL=http://example2.com 
SECRET_KEY=ABDFWEDFSADFWWEFSFSDFM

# You can even define the compose file in an env variable like so:
COMPOSE_CONFIG=my-compose-file.yml
# You can define other compose files, and just comment them out
# when not needed:
# COMPOSE_CONFIG=another-compose-file.yml

তারপরে এই বাশ স্ক্রিপ্টটি একই ডিরেক্টরিতে চালান, যা সবকিছু সঠিকভাবে স্থাপন করতে হবে:

#!/bin/bash

docker rm -f `docker ps -aq -f name=myproject_*`
set -a
source .env
cat ${COMPOSE_CONFIG} | envsubst | docker-compose -f - -p "myproject" up -d

আপনার রচনা ফাইলটিতে কেবল আপনার এনভিভ ভেরিয়েবলগুলি সাধারণ ব্যাশ সিনট্যাক্সের (যেমন ফাইল থেকে ${SECRET_KEY}সন্নিবেশ করানোর জন্য ) সাথে উল্লেখ করুন।SECRET_KEY.env

নোটটি COMPOSE_CONFIGআমার .envফাইলে সংজ্ঞায়িত করা হয়েছে এবং আমার ব্যাশ স্ক্রিপ্টে ব্যবহৃত হয়েছে তবে আপনি সহজেই ব্যাশ স্ক্রিপ্টের {$COMPOSE_CONFIG}সাথে প্রতিস্থাপন করতে পারেন my-compose-file.yml

এছাড়াও নোট করুন যে আমি আমার সমস্ত পাত্রে "মাইপ্রজেক্ট" উপসর্গের সাথে নাম রেখে এই স্থাপনার লেবেল করেছি। আপনি যে কোনও নাম ব্যবহার করতে পারেন তবে এটি আপনার পাত্রে সনাক্ত করতে সহায়তা করে যাতে আপনি পরে এগুলি সহজেই উল্লেখ করতে পারেন। আপনার ধারকরা রাষ্ট্রহীন, ধরে নেওয়া উচিত যে সেগুলি হওয়া উচিত, এই স্ক্রিপ্টটি আপনার .env ফাইল প্যারাম এবং আপনার রচনা YAML ফাইল অনুযায়ী আপনার পাত্রে দ্রুত মুছে ফেলা এবং পুনরায় প্রচার করবে।

আপডেট যেহেতু এই উত্তরটি বেশ জনপ্রিয় বলে মনে হচ্ছে, তাই আমি একটি ব্লগ পোস্ট লিখেছিলাম যা আমার ডকার মোতায়েনের কর্মপ্রবাহকে আরও গভীরতার সাথে বর্ণনা করে: http://lukeswart.net/2016/03/lets-deploy-part-1/ আপনি যুক্ত করার পরে এটি সহায়ক হতে পারে ডিগ্রি কনফিগারেশন, এনগিনেক্স কনফিগারেশন, লেটসেক্রিপ্ট সার্টস এবং লিঙ্কযুক্ত ধারকগুলির মতো আরও জটিলতা।


2
আপনি কেবল grep foo file.textপরিবর্তে করতে পারেন cat file.text | grep foo। আমার ক্ষেত্রে আমার ছিল export $(grep "^[^#]" .config | xargs) && cat docker-compose.yml | envsubst
জর্হে লভেন

"আমি লক্ষ্য করি লোকেরা ডকের পরিবেশগত ভেরিয়েবল সমর্থন নিয়ে সমস্যা আছে" - আপনার কাছে কোনও বিবরণ বা কোনও টিকিটের লিঙ্ক আছে?
নভেম্বর

দুঃখিত, আমি যে নির্দিষ্ট সমস্যার মুখোমুখি হয়েছি তা লগ করিনি, এবং এটি এত দিন আগে (~ 6 মাস) হয়েছে, এটি এখনও প্রাসঙ্গিক কিনা তা আমি জানি না। তবে হ্যাঁ, ডকার এনভায়রনমেন্ট ভেরিয়েবল সাপোর্টে কিছু বৈশিষ্ট্য বগি ছিল এবং এটি একাধিক ব্যবহারকারীর দ্বারা প্রতিবেদন করা হয়েছিল। আমি বিশ্বাস করি এটি এখন অনেক ভাল। তবে যখন ডিপ্লোয়মেন্ট কনফিগারেশনটি উল্লেখযোগ্যভাবে জটিল হয়ে যায়, আমি কনটেইনার অর্কেস্ট্রেশনের জন্য কনফিগারেশন লজিক এবং ডকার কমপোজ পরিচালনা করতে ব্যাশ ব্যবহার করে এটি সংশোধন করতে পছন্দ করব।
Modulitos

8
পিএসএ: এটি কেবল সাথে কাজ করেdocker-compose up এবং সাথে নয় docker-compose run
ক্রেইগ্ল্যাসটিগ

5
এই সমাধানটি হ'ল ডকস.ডকার.কম্পোজ / কমপোজ- ফাইল /#envfile যা আমি যেখানে আপনি .envনীচে থেকে পরিবেশের ভেরিয়েবল যুক্ত করেন তা আমি ব্যবহার করি env_file। তারপরে আপনি docker-compose.ymlব্যবহারের ক্ষেত্রে ভেরিয়েবলগুলি উল্লেখ করতে পারেন${VARIABLE}
মুসলে

111

দেখে মনে হচ্ছে যে ডকার-রচনায় ফাইলে ডিফল্ট এনভায়রনমেন্ট ভেরিয়েবলের জন্য এখন স্থানীয় সমর্থন রয়েছে ।

আপনাকে যা করতে হবে তা হ'ল নামের একটি ফাইলের মধ্যে আপনার ভেরিয়েবলগুলি ঘোষণা করতে .envহবে এবং সেগুলি ডকার-কমপোজ.আইএমএল এ উপলব্ধ হবে।

উদাহরণস্বরূপ, .envবিষয়বস্তু সহ ফাইলের জন্য :

MY_SECRET_KEY=SOME_SECRET
IMAGE_NAME=docker_image

আপনি আপনার ভেরিয়েবলটি ভিতরে প্রবেশ করতে পারেন docker-compose.ymlবা সেগুলি ধারকটিতে ফরোয়ার্ড করতে পারেন :

my-service:
  image: ${IMAGE_NAME}
  environment:
    MY_SECRET_KEY: ${MY_SECRET_KEY}

4
এটিই সেরা সমাধান!
লাডেনকভ ভ্লাদিস্লাভ

4
এটি আমার পক্ষেও কাজ করেছিল। কেন জানি না তবে ফাইলটির নামটি আক্ষরিকভাবে হওয়া উচিত .env, উদাহরণস্বরূপ config.envআমার পক্ষে কাজ করেনি।
এইচবিট

1
@ এইচবিট দি "।" মানে একটি লুকানো ফাইল - এটি স্থানীয় কনফিগারেশনের ফাইলগুলির জন্য সাধারণ প্রক্রিয়া
জেরেমি হাজেক

2
সবচেয়ে ভালো সমাধান. এবং আমরা / ইত্যাদি / এনভায়রনমেন্ট প্রপস যুক্ত করতে পারি এবং এগুলিকে .env ব্যবহার করে পরিবেশ হিসাবে ব্যবহার করতে পারি। এটি আরও সুরক্ষিত হবে।
চিন্তক দিনদাস

24

ধারকটির ভিতরে ডকার-রচনা 3.x সেট পরিবেশ পরিবর্তনশীলগুলির জন্য নিম্নলিখিত প্রযোজ্য

পদ্ধতি - 1 সরল পদ্ধতি

web:
  environment:
    - DEBUG=1
      POSTGRES_PASSWORD: 'postgres'
      POSTGRES_USER: 'postgres'

পদ্ধতি - 2 ".env" ফাইল

ডকার-কমপোজ.আইএমএল হিসাবে একই স্থানে একটি .env ফাইল তৈরি করুন

$ cat .env
TAG=v1.5
POSTGRES_PASSWORD: 'postgres'

এবং আপনার রচনা ফাইলটি এর মত হবে

$ cat docker-compose.yml
version: '3'
services:
  web:
    image: "webapp:${TAG}"
    postgres_password: "${POSTGRES_PASSWORD}"

উৎস


2
আমি পদ্ধতির ১ টির একটি সম্পূর্ণ উদাহরণ দেখতে চাই I আমি এই কাজটি করতে পারিনি, তাই .env ফাইল (যা ভাল কাজ করেছে) ব্যবহার করে শেষ হয়েছিল।
ববহাই

20

পরিবেশের ভেরিয়েবলগুলি ভলিউমের জন্য ব্যবহার করার সময় আপনার প্রয়োজন:

  1. একই ফোল্ডারে .env ফাইল তৈরি করুন যা docker-compose.yaml ফাইল রয়েছে

  2. .envফাইলটিতে পরিবর্তনশীল ঘোষণা করুন:

    HOSTNAME=your_hostname
    
  3. পরিবর্তন $hostnameকরার জন্য ${HOSTNAME}docker-compose.yaml ফাইল

    proxy:
      hostname: ${HOSTNAME}
      volumes:
        - /mnt/data/logs/${HOSTNAME}:/logs
        - /mnt/data/${HOSTNAME}:/data
    

অবশ্যই আপনি প্রতিটি বিল্ডে গতিশীলভাবে এটি করতে পারেন:

echo "HOSTNAME=your_hostname" > .env && sudo docker-compose up

9
দ্রষ্টব্য, দস্তাবেজ অনুসারে:The .env file feature only works when you use the docker-compose up command and does not work with docker stack deploy.
জেমস জেন্টস

19

সর্বোত্তম উপায় হ'ল docker-compose.ymlফাইলের বাইরে পরিবেশের ভেরিয়েবলগুলি নির্দিষ্ট করা । আপনি env_fileসেটিংটি ব্যবহার করতে পারেন এবং একই লাইনের মধ্যে আপনার পরিবেশ ফাইলটি সংজ্ঞায়িত করতে পারেন । তারপরে আবার ডকার-কমপোজ করে নতুন পরিবেশের ভেরিয়েবলগুলি দিয়ে পাত্রে পুনরায় তৈরি করা উচিত।

এখানে আমার ডকার-কম্পোজ.আইএমএল দেখতে কেমন:

services:
  web:
    env_file: variables.env

দ্রষ্টব্য: ডকার-কম্পোজ আশা করে যে একটি এনভিও ফাইলের প্রতিটি লাইন VAR=VALফর্ম্যাটে থাকবে। ফাইলের exportভিতরে ব্যবহার করা এড়িয়ে চলুন .env। এছাড়াও.env ফাইলটি ফোল্ডারে রাখা উচিত যেখানে ডকার-রচনা আদেশটি কার্যকর করা হয়।


2
সত্যিই সেরা উপায়
ড্যানি

কোন। এটি স্বয়ংক্রিয়ভাবে ডকারের ধারকটির মধ্যে পরিবেশের পরিবর্তনগুলি উপলব্ধ করবে না। আপনার এখনও পরিবেশ বিভাগের অধীনে এগুলি স্পষ্টভাবে উল্লেখ করা দরকার।
কেটি

6

আপনি পারবেন না ... এখনও। তবে এটি একটি বিকল্প, ডকার-কমপোজার.আইএমএল জেনারেটরের মতো ভাবেন:

https://gist.github.com/Vad1mo/9ab63f28239515d4dafd

মূলত একটি শেল স্ক্রিপ্ট যা আপনার ভেরিয়েবলগুলি প্রতিস্থাপন করবে। এছাড়াও আপনি আপনার সিআই প্রক্রিয়া শেষে আপনার ডকার রচনা ফাইল তৈরি করতে গ্রান্ট টাস্ক ব্যবহার করতে পারেন।


4

আমার এটির জন্য একটি সহজ বাশ স্ক্রিপ্ট তৈরি করা হয়েছে যার অর্থ এটি ব্যবহারের আগে আপনার ফাইলে এটি চালানো: https://github.com/antonosmond/subber

মূলত পরিবেশের ভেরিয়েবলগুলি বোঝাতে ডাবল কোঁকড়া ধনুর্বন্ধনী ব্যবহার করে আপনার রচনা ফাইলটি তৈরি করুন যেমন:

app:
    build: "{{APP_PATH}}"
ports:
    - "{{APP_PORT_MAP}}"

ডাবল কোঁকড়া ধনুর্বন্ধনী মধ্যে যে কোনও কিছু একই নামের পরিবেশে পরিবর্তনশীল হিসাবে প্রতিস্থাপন করা হবে যদি আমার কাছে নিম্নলিখিত পরিবেশের ভেরিয়েবল সেট থাকে:

APP_PATH=~/my_app/build
APP_PORT_MAP=5000:5000

চলমান উপর subber docker-compose.ymlফলে ফাইল অনুরূপ হবে:

app:
    build: "~/my_app/build"
ports:
    - "5000:5000"

2

আমি যতদূর জানি, এটি একটি কার্য-অগ্রগতি। তারা এটি করতে চায়, তবে এটি এখনও প্রকাশ হয়নি। 1377 দেখুন ("নতুন" 495 যা @ অ্যান্ডির দ্বারা উল্লেখ করা হয়েছিল)।

@ থমাস দ্বারা প্রস্তাবিত "সিআইআই এর অংশ হিসাবে জেনারেট। জিমেল" পদ্ধতির প্রয়োগ আমি শেষ করেছি।


1

.env ফাইলে env যুক্ত করুন

যেমন

VERSION=1.0.0

তারপরে এটি সংরক্ষণ করুন deploy.sh

INPUTFILE=docker-compose.yml
RESULT_NAME=docker-compose.product.yml
NAME=test

prepare() {
        local inFile=$(pwd)/$INPUTFILE
        local outFile=$(pwd)/$RESULT_NAME
        cp $inFile $outFile
        while read -r line; do
            OLD_IFS="$IFS"
            IFS="="
            pair=($line)
            IFS="$OLD_IFS"
               sed -i -e "s/\${${pair[0]}}/${pair[1]}/g" $outFile
            done <.env
     }
       
deploy() {
        docker stack deploy -c $outFile $NAME
}

        
prepare
deploy
    

1

ডকার-কম্পেস.আইএমএল এ গতিশীল মানগুলি সংজ্ঞায়িত করতে .env ফাইলটি ব্যবহার করুন। সেটি পোর্ট বা অন্য কোনও মানই হোক।

নমুনা ডকার-রচনা:

testcore.web:
       image: xxxxxxxxxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/testcore:latest
       volumes: 
            - c:/logs:c:/logs
       ports:
            - ${TEST_CORE_PORT}:80
       environment:
            - CONSUL_URL=http://${CONSUL_IP}:8500 
            - HOST=${HOST_ADDRESS}:${TEST_CORE_PORT}

.Env ফাইলের ভিতরে আপনি এই ভেরিয়েবলের মান নির্ধারণ করতে পারেন:

CONSUL_IP=172.31.28.151
HOST_ADDRESS=172.31.16.221
TEST_CORE_PORT=10002

1
env SOME_VAR="I am some var" OTHER_VAR="I am other var" docker stack deploy -c docker-compose.yml

সংস্করণ 3.6 ব্যবহার করুন:

version: "3.6"
services:
  one:
    image: "nginx:alpine"
    environment:
      foo: "bar"
      SOME_VAR:
      baz: "${OTHER_VAR}"
    labels:
      some-label: "$SOME_VAR"
  two:
    image: "nginx:alpine"
    environment:
      hello: "world"
      world: "${SOME_VAR}"
    labels:
      some-label: "$OTHER_VAR"

আমি এটি এই লিঙ্কটি https://github.com/docker/cli/issues/939 ফর্ম পেয়েছি


1

১.২৪.৪ থেকে, ডকার-কমপোজ সেই বিকল্পটিকে সমর্থন করে --env-fileযা আপনাকে ভেরিয়েবলযুক্ত ফাইল নির্দিষ্ট করতে সক্ষম করে।

আপনার দেখতে এইরকম হওয়া উচিত:

hostname=my-host-name

এবং আদেশ:

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