ডকফাইফাইলে পরিবেশের পরিবর্তনশীল মান পান


253

আমি একটি রুবি অ্যাপের জন্য একটি ধারক তৈরি করছি। আমার অ্যাপ্লিকেশনটির কনফিগারেশনটি এনভায়রনমেন্ট ভেরিয়েবলের মধ্যে রয়েছে (অ্যাপের অভ্যন্তরে ডটেনভ যুক্ত ) load

এই কনফিগারেশন ভেরিয়েবলগুলির মধ্যে একটি হ'ল অ্যাপটির সর্বজনীন আইপি, যা লিঙ্কগুলি তৈরি করতে অভ্যন্তরীণভাবে ব্যবহৃত হয়। আমার এই আইপিটি কনটেইনারটির ভিতরে 127.0.0.1 এ নির্দেশ করে একটি dnsmasq এন্ট্রি যুক্ত করতে হবে, যাতে এটি অ্যাপ্লিকেশনগুলির লিঙ্কগুলি এমনভাবে আনতে পারে যেন এটি কনটেইনারযুক্ত ছিল না।

অতএব আমি ENVআমার ডকফাইফিলের মধ্যে একটি সেট করার চেষ্টা করছি যা ধারকটির পরিবেশগত পরিবর্তনটি পাস করবে।

আমি কয়েকটি জিনিস চেষ্টা করেছিলাম।

ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`

যদিও পরিবেশের ভেরিয়েবলের মানটির পরিবর্তে সবকিছু "REQUEST_DOMAIN" স্ট্রিংটি পাস করে। হোস্ট মেশিন থেকে ধারকটিতে পরিবেশের ভেরিয়েবলের মানগুলি পাস করার কোনও উপায় আছে কি?

উত্তর:


392

আপনার ডকফাইফিলের ARGনির্দেশিকাটি ব্যবহার করা উচিত যা এই উদ্দেশ্যে।

ARGনির্দেশ একটি পরিবর্তনশীল ব্যবহারকারীরা Docker বিল্ড কমান্ড ব্যবহার করে নির্মাতার বিল্ড-সময়ে পাস করতে পারেন সংজ্ঞায়িত --build-arg <varname>=<value>পতাকা।

সুতরাং আপনার ডকফাইফিলের এই লাইনটি থাকবে:

ARG request_domain

বা যদি আপনি একটি ডিফল্ট মান পছন্দ করেন:

ARG request_domain=127.0.0.1

এখন আপনি এই পরিবর্তনশীলটি আপনার ডকফাইফিলের মধ্যে উল্লেখ করতে পারেন:

ENV request_domain=$request_domain

তাহলে আপনি নিজের ধারকটি এভাবে তৈরি করবেন:

$ docker build --build-arg request_domain=mydomain Dockerfile


দ্রষ্টব্য 1: আপনি যদি ARGআপনার ডকফাইলে একটি রেফারেন্স রেখেছেন তবে এটি বাদ দিলে আপনার চিত্রটি তৈরি করবে না --build-arg

দ্রষ্টব্য 2: কোনও ব্যবহারকারী যদি কোনও বিল্ড আর্গুমেন্ট নির্দিষ্ট করে যা ডকফাইফিলে সংজ্ঞায়িত করা হয়নি, বিল্ডটি একটি সতর্কতা প্রকাশ করে:

[সতর্কতা] এক বা একাধিক বিল্ড-আরগস [ফুও] গ্রাহ্য হয়নি।


12
এআরজি ডকার ভি 1 .9 এর পরে পাওয়া যায়।
সেনেসো

এটি কি ডকার রেপোতে দূরবর্তীভাবে নির্মিত সমর্থনযোগ্য?
জেমস লিন

4
Your image will not build if you have referenced an ARG in your Dockerfile but excluded it in --build-argআপনি ভুল. আপনি বিল্ড-আরগ ছাড়াই রেফারেন্স সহ চিত্র তৈরি করতে পারেন। এছাড়াও আপনি বিল্ড আরগের জন্য ডিফল্ট মান সেট করতে পারেন।
ALex_hha

1
ENV লাইনের উদ্দেশ্য কী? আমার জন্য - বিল্ড-আরগ + এআরজি যথেষ্ট ছিল।
ফিল

3
এআরজি পরবর্তী কমান্ডগুলিতে ডকফাইফিলের অভ্যন্তরে ব্যবহারের জন্য একটি পরিবর্তনশীল সংজ্ঞায়িত করে। ENV পরিবেশের পরিবর্তনশীলকে সংজ্ঞায়িত করে যা ধারককে দেওয়া হয়।
হার্ম

56

সুতরাং আপনি এটি করতে পারেন: cat Dockerfile | envsubst | docker build -t my-target -

তারপরে এমন একটি ডকফায়াইল রাখুন:

ENV MY_ENV_VAR $MY_ENV_VAR

আমার ধারণা কিছু বিশেষ অক্ষর নিয়ে সমস্যা হতে পারে তবে এটি বেশিরভাগ ক্ষেত্রে কমপক্ষে কাজ করে।


13
ডকফাইফাইল ধারণকারী ডিরেক্টরি থেকে আপনার ফাইলগুলি যুক্ত করার প্রয়োজন হলে এটি কাজ করে না বলে মনে হচ্ছে।
টম হেনেন

2
খুব সুন্দর সমাধান! একটি ম্যাকের envsubstঅংশ হিসাবে আপনি এটি পেতে পারেন brew install gettext। তবে বিএসডি বিল্ড সিস্টেমের সাথে সম্ভাব্য দ্বন্দ্বের কারণে এটি "কেবল-কেবল" এবং কোনও সিমলঙ্ক তৈরি হয় না। তবে এটি ln -s /usr/local/Cellar/gettext/*/bin/envsubst /usr/local/bin/আপনার প্যাথএইচ কমান্ড যুক্ত করা নিরাপদ । (এটি সত্যই উদ্বেগের /usr/local/Cellar/gettext/*/bin/envsubst
বিষয়গুলি bs

1
@ টমহেনেনের মন্তব্যটি স্পষ্ট করার docker build -জন্য, ডকফাইফিলকে পাইপ করা হচ্ছে, বিশেষত, আপনি যখন ডকফাইফাইল থেকে আপেক্ষিক পাথ উল্লেখ করেন তখন কী কাজ করে না, এনভি ভার্স প্রতিস্থাপন নির্বিশেষে।
সুপারইব

4
পুনরায় টমহেনেনের মন্তব্য, আপনি যদি নিজের ডকফেরলে কপির মতো প্রসঙ্গ নির্ভর নির্ভর কমান্ডগুলি ব্যবহার করতে চান তবে আপনি সর্বদা একটি অস্থায়ী ফাইলে এনভ্যাসউবস্টের আউটপুট পুনর্নির্দেশ করতে পারেন এবং তারপরে এটি ফিড করতে পারেন docker build। উদাহরণ: cat Dockerfile | envsubst > DockerfileWithEnvVarsতারপর, docker build -t my-target -f DockerfileWithEnvVars .তারপর,rm DockerfileWithEnvVars
snark

অথবা আপনি মুরগি প্যাকেজ থেকে স্পঞ্জ ব্যবহার করতে পারেনenvsubst < Dockerfile | sponge Dockerfile
ALex_hha

19

ব্যবহার করে একটি বিকল্প envsubstমত কমান্ড ব্যবহার করার ক্ষমতা হারানো ছাড়া COPYবা ADD, এবং অন্তর্বর্তী ফাইল ব্যবহার না করেই ব্যাশ এর ব্যবহার করতে হবে প্রক্রিয়া উপকল্পন :

docker build -f <(envsubst < Dockerfile) -t my-target .

3
দুর্ভাগ্যক্রমে এটি কাজ করে না বলে মনে হচ্ছে (ডকার 17.09), আমি ত্রুটিটি unable to prepare context: the Dockerfile (/dev/fd/63) must be within the build context
পেয়েছি

11

আপনি রানটাইম সময় তৈরি করেন এমন একটি ফাইল থেকে পরিবেশের ভেরিয়েবলগুলি লোড করুন।

export MYVAR="my_var_outside"
cat > build/env.sh <<EOF
MYVAR=${MYVAR}
EOF

... তাহলে ডকফাইলে

ADD build /build
RUN /build/test.sh

যেখানে test.sh env.sh থেকে MYVAR লোড করে

#!/bin/bash
. /build/env.sh
echo $MYVAR > /tmp/testfile

4

আপনি যদি কেবল ডকফাইফিলের মধ্যে সমস্ত পরিবেশের ভেরিয়েবল ($ উদাহরণ এএনভিভার) সন্ধান এবং প্রতিস্থাপন করতে চান তবে এটি তৈরি করুন এটি কার্যকর হবে:

envsubst < /path/to/Dockerfile | docker build -t myDockerImage . -f -


এখানে সেরা উত্তর, এবং তার উপর ভিত্তি করে, করতে সক্ষম হয়েছিল: envsubst < ./Dockerfile | docker build -squash -t ${DOCKIMG}:${VERSION} . -f -যেখানে FROMলাইনটি পরিবেশের পরিবর্তনশীল ব্যবহার করছে।
মাইকেকোয়েন্টেল

-6

-eধারক পরিবেশগত ভেরিয়েবল পাস করার জন্য কী যুক্ত করুন । উদাহরণ:

$ MYSQLHOSTIP=$(sudo docker inspect -format="{{ .NetworkSettings.IPAddress }}" $MYSQL_CONRAINER_ID)
$ sudo docker run -e DBIP=$MYSQLHOSTIP -i -t myimage /bin/bash

root@87f235949a13:/# echo $DBIP
172.17.0.2

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