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
Antworten:
Sie können mit Umwelt Ersatz in Ihrem
Dockerfile
wie folgt:quelle
=
Gleichheitszeichen notwendig?=
Sie darauf, dass es keine Leerzeichen geben muss. Wenn Sie Leerzeichen hinzufügen, wird=
diesENV PATH = "/opt/gtk/bin:${PATH}"
Ihren $ PATH zum$PATH
angehängten HOSTs aktualisiert ?ENV PATH="/opt/gtk/bin:${PATH}"
ist möglicherweise nicht dasselbe wieENV 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 tunRUN echo $PATH
und zu vergleichen mitRUN echo ${PATH}
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
ENV
Richtlinie, sondern die nachfolgende AnweisungRUN export $PATH
Sie müssen die Umgebungsvariablen nicht exportieren, nachdem Sie sie
ENV
in Ihrer Docker-Datei über deklariert haben.Sobald die
RUN export ...
Linien entfernt wurden, wurde mein Image erfolgreich erstelltquelle
RUN A=B
,RUN export A
UndRUN export A=B
sind gültig Shell - Befehle, aber Auswirkungen auf die Umwelt nur von Befehlen , die in derselben folgenRUN
Richtlinie (aber keine angegeben wurden ). In ähnlicher Weise würde sichRUN export PATH=/foo; prog1; prog2;
die PATH-Änderung aufprog1
und auswirken , wenn Sie (im selben RUN) hättenprog2
. SoRUN export $PATH
ist 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 ?Dies wird nicht empfohlen (wenn Sie ein sauberes Docker-Image erstellen / verteilen möchten), da der Wert
PATH
per/etc/profile
Skript festgelegt wird und der Wert überschrieben werden kann.head /etc/profile
::Am Ende der Docker-Datei können Sie Folgendes hinzufügen:
Somit ist PATH für alle Benutzer festgelegt.
quelle
/etc/environment
ist eine Liste der Zuweisungsausdrücke, kein Skript und keine variable Erweiterung nicht unterstützt, so dass es unwahrscheinlich ist , dass dieRUN
Syntax funktionieren würde.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>
.export
wird wahrscheinlich zum Scheitern führen, es sei denn, Ihr System unterstützt schwarze Magie außerhalb der Spezifikation.