767 Stimmen

In einem Dockerfile, wie aktualisiert man die PATH-Umgebungsvariable?

Ich habe eine Dockerdatei, die GTK aus dem Quellcode herunterlädt und erstellt, aber die folgende Zeile aktualisiert nicht die Umgebungsvariable meines Images:

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

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

ENV PATH /opt/gtk/bin:$PATH

Das ist meine gesamte Dockerdatei:

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

# Setzen von Umgebungsvariablen vor dem Ausführen von 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

# Ausführen von ldconfig nach make install, damit die neu installierten Bibliotheken gefunden werden.
RUN ldconfig

# Setzen der LD_LIBRARY_PATH Umgebungsvariable, damit der dynamische Linker des Systems die neu installierten Bibliotheken finden kann.
RUN LD_LIBRARY_PATH="/opt/gtk/lib"

# Aktualisierung des PATH-Umgebungsprogramms, damit Dienstprogrammbinärdateien, die von verschiedenen Bibliotheken installiert wurden, gefunden werden.
RUN PATH="/opt/gtk/bin:$PATH"
RUN export LD_LIBRARY_PATH PATH

# Müll einsammeln
RUN rm -rf gtk+-3.12.2.tar.xz

# Erstellen des Wurzelverzeichnisses des Go-Codes
RUN mkdir gocode
RUN mkdir gocode/src
RUN mkdir gocode/bin
RUN mkdir gocode/pkg

# Setzen der GOROOT- und GOPATH-Umgebungsvariablen, alle erstellten Befehle werden automatisch zum PATH hinzugefügt
RUN GOROOT=/usr/lib/go
RUN GOPATH=/root/gocode
RUN PATH=$GOPATH/bin:$PATH
RUN export GOROOT GOPATH PATH

1201voto

Homme Zwaagstra Punkte 9983

Sie können Umgebungsvariablenersetzung in Ihrer Dockerfile wie folgt verwenden:

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

70voto

dankirkd Punkte 1939

[Ich habe dies als Antwort auf die ausgewählte Antwort erwähnt, aber es wurde vorgeschlagen, es als eigene Antwort hervorzuheben]

Es sollte beachtet werden, dass

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

eventuell nicht dasselbe ist wie

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

Ersteres, mit geschweiften Klammern, könnte Ihnen den Pfad des Hosts liefern. Die Dokumentation legt nicht nahe, dass dies der Fall wäre, aber ich habe beobachtet, dass es so ist. Dies ist einfach zu überprüfen, machen Sie einfach RUN echo $PATH und vergleichen Sie es mit RUN echo ${PATH}

68voto

ILikeTacos Punkte 15685

Obwohl die Antwort, die Gunter gepostet hat, korrekt war, ist sie nicht anders als das, was ich bereits gepostet hatte. Das Problem war nicht die ENV Anweisung, sondern die nachfolgende Anweisung RUN export $PATH

Es ist nicht notwendig, die Umgebungsvariablen zu exportieren, sobald Sie sie über ENV in Ihrem Dockerfile deklariert haben.

Sobald die RUN export ... Zeilen entfernt wurden, wurde mein Bild erfolgreich erstellt

11voto

Thomas Decaux Punkte 19874

Dies wird nicht empfohlen (wenn Sie ein sauberes Docker-Image erstellen/verteilen möchten), da die PATH-Variable vom Skript /etc/profile 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 des Dockerfiles könnten Sie hinzufügen:

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

So ist der PATH für alle Benutzer gesetzt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X