একটি ডকফাইলে, কীভাবে PATH এনভায়রনমেন্ট ভেরিয়েবল আপডেট করবেন?


388

আমার একটি ডকফায়াইল রয়েছে যা উত্স থেকে জিটিকে ডাউনলোড করে এবং তৈরি করে তবে নীচের লাইনটি আমার চিত্রের পরিবেশের পরিবর্তনশীলটিকে আপডেট করছে না:

RUN PATH="/opt/gtk/bin:$PATH"
RUN export PATH

আমি পড়েছি যে পরিবেশের মান নির্ধারণের জন্য আমার ENV ব্যবহার করা উচিত, তবে নিম্নলিখিত নির্দেশাবলীটি কার্যকর হয় বলে মনে হয় না:

ENV PATH /opt/gtk/bin:$PATH

এটি আমার সম্পূর্ণ ডকফায়াইল:

FROM ubuntu
RUN apt-get update
RUN apt-get install -y golang gcc make wget git libxml2-utils libwebkit2gtk-3.0-dev libcairo2 libcairo2-dev libcairo-gobject2 shared-mime-info libgdk-pixbuf2.0-* libglib2-* libatk1.0-* libpango1.0-* xserver-xorg xvfb

# Downloading GTKcd
RUN wget http://ftp.gnome.org/pub/gnome/sources/gtk+/3.12/gtk+-3.12.2.tar.xz
RUN tar xf gtk+-3.12.2.tar.xz
RUN cd gtk+-3.12.2

# Setting environment variables before running configure
RUN CPPFLAGS="-I/opt/gtk/include"
RUN LDFLAGS="-L/opt/gtk/lib"
RUN PKG_CONFIG_PATH="/opt/gtk/lib/pkgconfig"
RUN export CPPFLAGS LDFLAGS PKG_CONFIG_PATH
RUN ./configure --prefix=/opt/gtk
RUN make
RUN make install

# running ldconfig after make install so that the newly installed libraries are found.
RUN ldconfig

# Setting the LD_LIBRARY_PATH environment variable so the systems dynamic linker can find the newly installed libraries.
RUN LD_LIBRARY_PATH="/opt/gtk/lib"

# Updating PATH environment program so that utility binaries installed by the various libraries will be found.
RUN PATH="/opt/gtk/bin:$PATH"
RUN export LD_LIBRARY_PATH PATH

# Collecting garbage
RUN rm -rf gtk+-3.12.2.tar.xz

# creating go code root
RUN mkdir gocode
RUN mkdir gocode/src
RUN mkdir gocode/bin
RUN mkdir gocode/pkg

# Setting the GOROOT and GOPATH enviornment variables, any commands created are automatically added to PATH
RUN GOROOT=/usr/lib/go
RUN GOPATH=/root/gocode
RUN PATH=$GOPATH/bin:$PATH
RUN export GOROOT GOPATH PATH

1
LD_LIBRARY_PATH এবং PATH ENV রফতানি না করে ব্যবহার করে সেট করা উচিত। আপনিও এলডি_লিবিআরএআইপিএইচটি PATH এর দিকে নির্দেশ করবেন না! ডকফাইলে ফাইলগুলি মুছে ফেলা আপনার চিত্রটি ছোট করে না, সেঞ্চুরিলিঙ্কল্যাবস / মেকিং -ডোকার- চিত্র / ? hvid=4wO7Yt পরীক্ষা করুন
জাভিয়ের ক্যাসেলেলানোস

বর্তমান ডকফাইল একটি বৈধ?
হুই ওয়াং

@ হুইওয়াং এটি নাও পারে। এটি লেখা হয়েছিল, এটি 1.5 বছর আগে লেখা হয়েছিল এবং তখন থেকেই অনেক কিছু পরিবর্তন হয়েছিল। কেবলমাত্র নিশ্চিত হয়ে নিন যে আপনি নির্বাচিত উত্তরে বর্ণিত পরিবর্তনগুলি অন্তর্ভুক্ত করছেন।
ILikeTacos

উত্তর:


608

আপনি নিম্নলিখিত হিসাবে আপনার পরিবেশ প্রতিস্থাপন ব্যবহার করতে পারেন Dockerfile:

ENV PATH="/opt/gtk/bin:${PATH}"

14
=সমান চিহ্ন কি প্রয়োজনীয়?
ইগোরগানাপলস্কি

16
@ ইগোরগানাপলস্কি এই উদাহরণে নয় কারণ এটি একটি একক ভেরিয়েবল নির্দিষ্ট করে। তবে একাধিক ভেরিয়েবল নির্দিষ্ট করার সময় এটি ক্ষতি করে না এবং এটি বাধ্যতামূলক। দেখুন ENV ডকুমেন্টেশন আরো বিস্তারিত জানার জন্য।
হোমমে জাওয়াগস্ট্রা

30
ওই কাজগুলো! =এটি ফাঁকা ছাড়াই হওয়া দরকার সে সম্পর্কে যত্ন নিন । আপনি যদি =এই জায়গার পছন্দ মতো জায়গাগুলি যোগ করেন তবে ENV PATH = "/opt/gtk/bin:${PATH}"আপনার $ পথ ক্র্যাশ করবে
ডিয়েগো জুলিয়াও

2
এই HOST এর $PATHসংযুক্ত ছবিটি আপডেট করবে না ?
Emmdee

2
ENV PATH="/opt/gtk/bin:${PATH}"ENV PATH="/opt/gtk/bin:$PATH"প্রাক্তন, কোঁকড়ানো বন্ধনী সহ, একই রকম নাও হতে পারে আপনাকে হোস্টের PATH সরবরাহ করতে পারে। ডকুমেন্টেশনটি এমনটি হ'ল বলে মনে হয় না, তবে আমি পর্যবেক্ষণ করেছি যে এটি। এটি ঠিক করা RUN echo $PATHএবং এটির সাথে তুলনা করা সহজRUN echo ${PATH}
dankirkd

49

যদিও গুনটার পোস্ট করেছে যে উত্তরটি সঠিক ছিল, তবে আমি ইতিমধ্যে যে পোস্ট করেছি তার চেয়ে আলাদা নয়। সমস্যাটি ENVনির্দেশনা নয়, পরবর্তী নির্দেশ ছিলRUN export $PATH

একবার ENVআপনার ডকফাইফিলের মাধ্যমে সেগুলি ঘোষণা করার পরে পরিবেশের পরিবর্তনগুলি রফতান করার দরকার নেই।

যত তাড়াতাড়ি RUN export ...লাইন সরানো হয়েছে, আমার চিত্র সফলভাবে নির্মিত হয়েছিল


4
RUN A=B, RUN export Aএবং RUN export A=B, বৈধ শেল কমান্ড, কিন্তু পরিবেশটি প্রভাবিত করে কেবল সেই একই RUNনির্দেশাবলীর অনুসরণকারী কমান্ডগুলির (তবে কিছুই দেওয়া হয় না)। একইভাবে, আপনার যদি RUN export PATH=/foo; prog1; prog2;(একই রুনে) থাকে, তবে পথের সংশোধন প্রভাবিত করবে prog1এবং prog2। সুতরাং, RUN export $PATHএকটি নূপুর (কারণ কোনও প্রোগ্রাম সেই সংশোধিত পরিবেশ ব্যবহার করে না) এবং যদি সেই নির্দেশ সেখানে থাকে বা না থাকে তবে এটির কোনও পার্থক্য করা উচিত। "গুন্টার" দ্বারা, আপনি কি এই উত্তরটি বোঝাতে চান ?
init_js

ফিক্সটি হ'ল একটি ENV নির্দেশের সাথে PATH মান পরিবর্তন করতে হবে, RUN নয়। তারপরে ডকার নির্মাতা নিম্নলিখিত আরএন-কে ডাকলে এই পরিবর্তনগুলি ঘটতে পারে।
init_js

5

এটি নিরুৎসাহিত করা হয় (যদি আপনি একটি পরিষ্কার ডকার চিত্র তৈরি / বিতরণ করতে চান), যেহেতু PATHভেরিয়েবলটি /etc/profileস্ক্রিপ্ট দ্বারা সেট করা হয় , মানটি ওভাররাইড করা যায়।

head /etc/profile:

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH

ডকফাইফাইলের শেষে, আপনি যুক্ত করতে পারেন:

RUN echo "export PATH=$PATH" > /etc/environment

সুতরাং সমস্ত ব্যবহারকারীদের জন্য PATH সেট করা আছে।


4
অনুযায়ী এই উবুন্টু ডকুমেন্টেশন , /etc/environment, একটি স্ক্রিপ্ট নিয়োগ এক্সপ্রেশন একটি তালিকা নয়, এবং পরিবর্তনশীল সম্প্রসারণ সমর্থন করে না, তাই এটি অসম্ভাব্য যে RUNসিনট্যাক্স কাজ করবে।
নিকোলাস লেফবভ্রে

3
হ্যাঁ, এটি প্রসারিত export PATH=<some path>হবে এবং এতে লিখিত হবে /etc/environment, যা এখনও ভুল কারণ ফাইলটি কোনও স্ক্রিপ্ট নয় বরং একটি তালিকা <var name>=<value>exportযদি না আপনার সিস্টেমটি অনুমানের বাইরে কিছু কালো যাদু সমর্থন করে তবে এটি ব্যর্থ হয়ে যাবে।
নিকোলাস লেফেব্রে 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.