Dockerfile dosyasında, PATH ortam değişkeni nasıl güncelleştirilir?


388

GTK'yı kaynaktan indirip oluşturan bir dockerfile'm var, ancak aşağıdaki satır görüntümün ortam değişkenini güncellemiyor:

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

Ortam değerlerini ayarlamak için ENV kullanmam gerektiğini okudum, ancak aşağıdaki talimat da işe yaramıyor gibi görünüyor:

ENV PATH /opt/gtk/bin:$PATH

Bu benim tüm Dockerfile'ım:

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 ve PATH, dışa aktarılmayan ENV kullanılarak ayarlanmalıdır. Ayrıca LD_LIBRARY_PATH PATH! 'I işaret etmemelisiniz. Dockerfile'daki dosyaları silmek resminizi küçülmez, centurylinklabs.com/optimizing-docker-images/?hvid=4wO7Yt adresini kontrol edin .
Javier Castellanos

geçerli dockerfile geçerli bir dosya mı?
Hui Wang

@HuiWang olmayabilir. Yazılmıştır, 1.5 yıl önce yazılmıştır ve o zamandan beri çok şey değişmiştir. Seçilen cevapta açıklanan değişiklikleri eklediğinizden emin olun.
ILikeTacos

Yanıtlar:


608

Sen kullanabilirsiniz Çevre Değişimi senin de Dockerfileaşağıdaki gibi:

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

14
Is =eşittir gerekli imzalamak?
IgorGanapolsky

16
@IgorGanapolsky Bu örnekte tek bir değişken belirttiği için değil. Ancak, birden fazla değişken belirtilirken incinmez ve zorunludur. Daha fazla ayrıntı için ENV belgelerine bakın.
Homme Zwaagstra

30
Bu çalışır! Lütfen =boşluksuz olması gerektiğine dikkat edin . Eğer boşluk eklerseniz yanında =böyle ENV PATH = "/opt/gtk/bin:${PATH}"SİZİN $ PATH kilitlenmesine
Diego Juliao

2
Bu, resmi HOST $PATHeklenmiş olarak güncellemeyecek mi?
emmdee

2
ENV PATH="/opt/gtk/bin:${PATH}"aynı olmayabilir ENV PATH="/opt/gtk/bin:$PATH"konağın PATH size sağlayabilir, kıvırcık parantez ile eski. Belgeler bunun böyle olacağını öne sürmüyor, ama öyle olduğunu gözlemledim. Bu sadece kontrol etmek RUN echo $PATHve karşılaştırmak için basitRUN echo ${PATH}
dankirkd

49

Gunter'ın gönderdiği cevap doğru olmasına rağmen, zaten gönderdiğimden farklı değil. Sorun ENVdirektif değil, sonraki talimattıRUN export $PATH

ENVDockerfile dosyasında bildirdikten sonra, ortam değişkenlerini dışa aktarmanıza gerek yoktur .

En kısa sürede RUN export ...hatları çıkarıldı, benim resim başarıyla inşa edildi


4
RUN A=B,, RUN export Ave RUN export A=B, geçerli kabuk komutlarıdır, ancak yalnızca aynı RUNyönergede izlenen komutların ortamını etkiler (ancak hiçbiri verilmez). Eğer olsaydı Benzer şekilde, RUN export PATH=/foo; prog1; prog2;(aynı RUN), YOL modifikasyon etkileyecek prog1ve prog2. Yani, RUN export $PATHbir noop (çünkü hiçbir program değiştirilmiş ortamı kullanmaz) ve bu direktifin var olup olmaması fark yaratmamalıdır. "Gunter" ile bu cevabı mı kastediyorsun ?
init_js

Düzeltme gerçekten PATH değerini bir ENV yönergesi ile değiştirmek, RUN değil. Daha sonra, docker oluşturucu aşağıdaki RUN'u çağırdığında bu değişiklikler devam eder.
init_js

5

Bu, önerilmez (temiz bir Docker görüntüsü oluşturmak / dağıtmak istiyorsanız), PATHdeğişken /etc/profilekomut dosyası tarafından ayarlandığından değer geçersiz kılınabilir.

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 dosyasının sonuna şunları ekleyebilirsiniz:

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

Böylece PATH tüm kullanıcılar için ayarlanmıştır.


4
Gereğince bu Ubuntu belgelerine , /etc/environmentatama ifadeleri listesi değil, bir senaryo olduğunu ve olası değildir, böylece değişken genişleme desteklemediği RUNsözdizimi çalışacak.
Nicolas Lefebvre

3
Evet, genişletilecek ve export PATH=<some path>yazılacak /etc/environment, bu dosya bir komut dosyası değil, bir liste olduğu için hala yanlış <var name>=<value>. exportsisteminiz teknik özelliklerin dışında bir kara büyü desteklemedikçe büyük olasılıkla başarısız olacaktır.
Nicolas Lefebvre
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.