Mam plik docker, który pobiera i buduje GTK ze źródła, ale następujący wiersz nie aktualizuje zmiennej środowiskowej mojego obrazu:
RUN PATH="/opt/gtk/bin:$PATH"
RUN export PATH
Przeczytałem, że powinienem używać ENV do ustawiania wartości środowiska, ale wydaje się, że poniższe instrukcje również nie działają:
ENV PATH /opt/gtk/bin:$PATH
To jest cały mój plik Docker:
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
Odpowiedzi:
Możesz użyć funkcji zamiany środowiska w
Dockerfile
następujący sposób:źródło
=
znak równości jest konieczny?=
to, żeby nie było spacji. Jeśli dodać przestrzenie obok=
takENV PATH = "/opt/gtk/bin:${PATH}"
padnie $ PATH$PATH
dołączonymi hostami?ENV PATH="/opt/gtk/bin:${PATH}"
może nie być taki sam jakENV PATH="/opt/gtk/bin:$PATH"
poprzedni, z nawiasami klamrowymi, może dostarczyć ścieżkę hosta. Dokumentacja nie sugeruje, aby tak było, ale zauważyłem, że tak jest.RUN echo $PATH
RUN echo ${PATH}
Chociaż odpowiedź opublikowana przez Guntera była poprawna, nie różni się od tej, którą już napisałem. Problemem nie była
ENV
dyrektywa, ale późniejsza instrukcjaRUN export $PATH
Nie ma potrzeby eksportowania zmiennych środowiskowych, po ich zadeklarowaniu
ENV
w pliku Docker.Gdy tylko
RUN export ...
linie zostały usunięte, mój obraz został pomyślnie zbudowanyźródło
RUN A=B
,,RUN export A
iRUN export A=B
są poprawnymi poleceniami powłoki, ale wpływają tylko na środowisko poleceń następujących po tej samejRUN
dyrektywie (ale nie podano żadnych). Podobnie, jeśli miałeśRUN export PATH=/foo; prog1; prog2;
(w tym samym URUCHOMIENIU), modyfikacja ŚCIEŻKI wpłynie naprog1
iprog2
. Jest więcRUN export $PATH
noop (ponieważ żaden program nie korzysta ze zmodyfikowanego środowiska) i nie powinno mieć znaczenia, czy ta dyrektywa istnieje, czy nie. Mówiąc „Gunter”, masz na myśli tę odpowiedź ?Jest to odradzane (jeśli chcesz utworzyć / rozpowszechnić czysty obraz Dockera), ponieważ
PATH
zmienna jest ustawiana przez/etc/profile
skrypt, wartość można zastąpić.head /etc/profile
:Na końcu pliku Docker można dodać:
Dlatego PATH jest ustawiony dla wszystkich użytkowników.
źródło
/etc/environment
jest to lista wyrażeń przypisania, a nie skrypt i nie obsługuje rozszerzania zmiennych, więc jest mało prawdopodobne, abyRUN
składnia działała.export PATH=<some path>
zostanie zapisany/etc/environment
, co jest nadal niepoprawne, ponieważ ten plik nie jest skryptem, ale listą<var name>=<value>
.export
prawdopodobnie sprawi, że się nie powiedzie, chyba że twój system obsługuje czarną magię poza specyfikacją.