Dockerfile में, PATH पर्यावरण चर को कैसे अपडेट करें?


388

मेरे पास एक डॉकटराइल है जो स्रोत से GTK को डाउनलोड और बनाता है, लेकिन निम्नलिखित पंक्ति मेरी छवि के पर्यावरण चर को अपडेट नहीं कर रही है:

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

मैंने पढ़ा कि मुझे पर्यावरण मूल्यों को निर्धारित करने के लिए ईएनवी का उपयोग करना चाहिए, लेकिन निम्न निर्देश काम नहीं करता है:

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 एक्सपोर्ट न करके सेट किया जाना चाहिए। आप भी LD_LIBRARY_PATH को PATH की ओर इशारा नहीं करना चाहिए। Dockerfile में फ़ाइलों को हटाने से आपकी छवि छोटी नहीं हो जाती, check सदीलिब्लास . com/optimizing-docker-images/ ? hvid=4wO7Yt
जेवियर कैस्टेलानोस

क्या वर्तमान डॉकफाइल एक वैध है?
हुई वांग

@HuiWang यह नहीं हो सकता है। यह लिखा गया था, यह 1.5 साल पहले लिखा गया था और तब से बहुत कुछ बदल गया है। बस सुनिश्चित करें कि आप चयनित उत्तर में वर्णित परिवर्तनों को शामिल करते हैं।
ILikeTacos

जवाबों:


608

आप उपयोग कर सकते हैं पर्यावरण रिप्लेसमेंट अपने में Dockerfileके रूप में इस प्रकार है:

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

14
क्या =बराबरी जरूरी है?
इगोरगानापोलस्की

16
@IgorGanapolsky इस उदाहरण में नहीं है क्योंकि यह एक एकल चर को निर्दिष्ट कर रहा है। हालाँकि, यह चोट नहीं करता है और कई चर निर्दिष्ट करते समय अनिवार्य है। देखें ENV प्रलेखन अधिक जानकारी के लिए।
होमी ज़वागस्त्र

30
यह काम करता है! कृपया ध्यान रखें कि =इसके बिना रिक्त स्थान के लिए आवश्यक है। यदि आप =इस तरह की जगहों को जोड़ते हैं तो यह ENV PATH = "/opt/gtk/bin:${PATH}"आपके $ पाथ
डिएगो जूलियो

2
क्या यह HOST के $PATHएपेंडेड छवि को अपडेट नहीं करेगा ?
इममी

2
ENV PATH="/opt/gtk/bin:${PATH}"ENV PATH="/opt/gtk/bin:$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;(उसी RUN में), PATH संशोधन प्रभावित होता है prog1और prog2। तो, RUN export $PATHएक noop है (क्योंकि कोई भी प्रोग्राम उस संशोधित वातावरण का उपयोग नहीं करता है) और यह कोई अंतर नहीं होना चाहिए कि क्या निर्देश है या नहीं। "गंटर" से, क्या आप इस उत्तर का मतलब समझते हैं ?
init_js

फिक्स वास्तव में एक ईएनवी निर्देश के साथ पेट मूल्य को बदलने के लिए है, न कि आरयूएन। तब उन बदलावों को आगे बढ़ाया जाएगा जब डॉक बिल्डर निम्नलिखित आरयूएन को आमंत्रित करता है।
init_js 21

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

Dockerfile के अंत में, आप जोड़ सकते हैं:

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

इसलिए PATH सभी उपयोगकर्ताओं के लिए सेट किया गया है।


4
इस Ubuntu दस्तावेज़ के अनुसार , /etc/environmentअसाइनमेंट एक्सप्रेशंस की एक सूची है, न कि कोई स्क्रिप्ट, और चर विस्तार का समर्थन नहीं करता है, इसलिए यह संभावना नहीं है कि RUNवाक्यविन्यास काम करेगा।
निकोलस लेफेब्रे

3
हां, इसका विस्तार किया export PATH=<some path>जाएगा और इसे लिखा जाएगा /etc/environment, जो अभी भी गलत है क्योंकि यह फाइल एक स्क्रिप्ट नहीं बल्कि एक सूची है <var name>=<value>exportजब तक आपका सिस्टम कल्पना के बाहर कुछ काले जादू का समर्थन करता है, तब तक यह विफल हो जाएगा।
निकोलस लेफ़ेब्रे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.