Saya memiliki dockerfile yang mengunduh dan membangun GTK dari sumber, tetapi baris berikut ini tidak memperbarui variabel lingkungan gambar saya:
RUN PATH="/opt/gtk/bin:$PATH"
RUN export PATH
Saya membaca bahwa saya harus menggunakan ENV untuk menetapkan nilai lingkungan, tetapi instruksi berikut ini tampaknya tidak berfungsi baik:
ENV PATH /opt/gtk/bin:$PATH
Ini seluruh Dockerfile saya:
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
Jawaban:
Anda dapat menggunakan Lingkungan Penggantian di Anda
Dockerfile
sebagai berikut:sumber
=
tanda sama dengan itu diperlukan?=
itu harus tanpa ruang. Jika Anda menambahkan spasi di sebelah=
seperti ini,ENV PATH = "/opt/gtk/bin:${PATH}"
AKAN MENGHANCURKAN $ PATH ANDA$PATH
ditambahkan?ENV PATH="/opt/gtk/bin:${PATH}"
mungkin tidak sama denganENV PATH="/opt/gtk/bin:$PATH"
Yang pertama, dengan kurung keriting, mungkin memberi Anda PATH tuan rumah. Dokumentasi tidak menyarankan ini akan menjadi masalah, tetapi saya telah mengamati bahwa itu benar. Ini sederhana untuk memeriksa lakukanRUN echo $PATH
dan bandingkanRUN echo ${PATH}
Meskipun jawaban yang diposting Gunter benar, itu tidak berbeda dari apa yang sudah saya posting. Masalahnya bukanlah
ENV
arahan, tetapi instruksi selanjutnyaRUN export $PATH
Tidak perlu mengekspor variabel lingkungan, setelah Anda mendeklarasikannya melalui
ENV
Dockerfile Anda.Segera setelah
RUN export ...
garis dihapus, gambar saya berhasil dibangunsumber
RUN A=B
,RUN export A
, DanRUN export A=B
, yang perintah shell yang valid, tapi mempengaruhi lingkungan hanya perintah yang mengikuti yang samaRUN
direktif (tetapi tidak diberikan). Demikian pula, jika Anda memilikiRUN export PATH=/foo; prog1; prog2;
(dalam RUN yang sama), modifikasi PATH akan mempengaruhiprog1
danprog2
. Jadi,RUN export $PATH
adalah noop (karena tidak ada program yang menggunakan lingkungan yang dimodifikasi) dan tidak ada bedanya apakah arahan itu ada atau tidak. Dengan "Gunter", maksud Anda jawaban ini ?Ini tidak disarankan (jika Anda ingin membuat / mendistribusikan gambar Docker yang bersih), karena
PATH
variabel diatur oleh/etc/profile
skrip, nilainya dapat diganti.head /etc/profile
:Di akhir Dockerfile, Anda dapat menambahkan:
Jadi PATH diatur untuk semua pengguna.
sumber
/etc/environment
adalah daftar ekspresi penugasan, bukan skrip, dan tidak mendukung ekspansi variabel, sehinggaRUN
sintaks tidak akan berfungsi.export PATH=<some path>
akan ditulis/etc/environment
, yang masih salah karena file itu bukan skrip tetapi daftar<var name>=<value>
.export
kemungkinan akan membuatnya gagal kecuali sistem Anda mendukung sihir hitam di luar spesifikasi.