Wie aktualisiere ich in einer Docker-Datei die Umgebungsvariable PATH?

388

Ich habe eine Docker-Datei, die GTK aus dem Quellcode herunterlädt und erstellt, aber in der folgenden Zeile wird die Umgebungsvariable meines Bildes nicht aktualisiert:

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

Ich habe gelesen, dass ich ENV verwenden sollte, um Umgebungswerte festzulegen, aber die folgende Anweisung scheint auch nicht zu funktionieren:

ENV PATH /opt/gtk/bin:$PATH

Dies ist meine gesamte Docker-Datei:

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
Ich mag Tacos
quelle
1
LD_LIBRARY_PATH und PATH sollten mit ENV und nicht mit Export festgelegt werden. Sie sind auch LD_LIBRARY_PATH sollte nicht auf PATH! Zeigen. Durch das Löschen von Dateien in der Docker-Datei wird Ihr Bild nicht kleiner. Überprüfen Sie centurylinklabs.com/optimizing-docker-images/?hvid=4wO7Yt .
Javier Castellanos
Ist die aktuelle Docker-Datei gültig?
Hui Wang
@ HuiWang kann es nicht. Es wurde geschrieben, es wurde vor 1,5 Jahren geschrieben und seitdem hat sich viel geändert. Stellen Sie einfach sicher, dass Sie die in der ausgewählten Antwort beschriebenen Änderungen übernehmen.
ILikeTacos

Antworten:

608

Sie können mit Umwelt Ersatz in Ihrem Dockerfilewie folgt:

ENV PATH="/opt/gtk/bin:${PATH}"
Homme Zwaagstra
quelle
14
Ist ein =Gleichheitszeichen notwendig?
IgorGanapolsky
16
@IgorGanapolsky Nicht in diesem Fall, da eine einzelne Variable angegeben wird. Es tut jedoch nicht weh und ist obligatorisch, wenn mehrere Variablen angegeben werden. Weitere Informationen finden Sie in der ENV-Dokumentation .
Homme Zwaagstra
30
Das funktioniert! Bitte achten =Sie darauf, dass es keine Leerzeichen geben muss. Wenn Sie Leerzeichen hinzufügen, wird =dies ENV PATH = "/opt/gtk/bin:${PATH}"Ihren $ PATH zum
Diego Juliao
2
Wird das Bild nicht mit den $PATHangehängten HOSTs aktualisiert ?
Emmdee
2
ENV PATH="/opt/gtk/bin:${PATH}"ist möglicherweise nicht dasselbe wie ENV PATH="/opt/gtk/bin:$PATH"Ersteres mit geschweiften Klammern liefert Ihnen möglicherweise den Pfad des Hosts. Die Dokumentation legt nicht nahe, dass dies der Fall wäre, aber ich habe festgestellt, dass dies der Fall ist. Dies ist einfach zu überprüfen, einfach zu tun RUN echo $PATHund zu vergleichen mitRUN echo ${PATH}
dankirkd
49

Obwohl die Antwort, die Gunter gepostet hat, richtig war, unterscheidet sie sich nicht von der, die ich bereits gepostet habe. Das Problem war nicht die ENVRichtlinie, sondern die nachfolgende AnweisungRUN export $PATH

Sie müssen die Umgebungsvariablen nicht exportieren, nachdem Sie sie ENVin Ihrer Docker-Datei über deklariert haben.

Sobald die RUN export ...Linien entfernt wurden, wurde mein Image erfolgreich erstellt

Ich mag Tacos
quelle
4
RUN A=B, RUN export AUnd RUN export A=Bsind gültig Shell - Befehle, aber Auswirkungen auf die Umwelt nur von Befehlen , die in derselben folgen RUNRichtlinie (aber keine angegeben wurden ). In ähnlicher Weise würde sich RUN export PATH=/foo; prog1; prog2;die PATH-Änderung auf prog1und auswirken , wenn Sie (im selben RUN) hätten prog2. So RUN export $PATHist ein noop (weil kein Programm verwendet die Umgebung modifiziert) und es sollte keinen Unterschied machen , ob diese Richtlinie ist oder nicht. Mit "Gunter" meinen Sie diese Antwort ?
init_js
Die Lösung besteht darin, den PATH-Wert mit einer ENV-Direktive zu ändern, nicht mit RUN. Diese Änderungen werden dann übertragen, wenn der Docker-Builder den folgenden RUN aufruft.
init_js
5

Dies wird nicht empfohlen (wenn Sie ein sauberes Docker-Image erstellen / verteilen möchten), da der Wert PATHper /etc/profileSkript festgelegt wird und der Wert überschrieben werden kann.

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

Am Ende der Docker-Datei können Sie Folgendes hinzufügen:

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

Somit ist PATH für alle Benutzer festgelegt.

Thomas Decaux
quelle
4
Gemäß dieser Dokumentation Ubuntu , /etc/environmentist eine Liste der Zuweisungsausdrücke, kein Skript und keine variable Erweiterung nicht unterstützt, so dass es unwahrscheinlich ist , dass die RUNSyntax funktionieren würde.
Nicolas Lefebvre
3
Ja, es wird erweitert und export PATH=<some path>wird geschrieben werden /etc/environment, die noch nicht korrekt ist , da diese Datei keinen Skript, sondern eine Liste <var name>=<value>. exportwird wahrscheinlich zum Scheitern führen, es sei denn, Ihr System unterstützt schwarze Magie außerhalb der Spezifikation.
Nicolas Lefebvre