Dans un Dockerfile, Comment mettre à jour la variable d'environnement PATH?
J'ai un dockerfile qui se télécharger et s'appuie GTK de la source, mais la ligne suivante n'est pas la mise à jour de mon image est variable d'environnement:
RUN PATH="/opt/gtk/bin:$PATH"
RUN export PATH
J'ai lu que je devrais être en utilisant ENV pour définir les valeurs de l'environnement, mais l'instruction suivante ne semble pas fonctionner soit:
ENV PATH /opt/gtk/bin:$PATH
C'est toute ma Dockerfile:
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
- Le LD_LIBRARY_PATH et le CHEMIN d'accès doit être défini à l'aide ENV pas de l'exportation. Vous êtes également LD_LIBRARY_PATH ne devrait pas être pointant vers le CHEMIN!. Suppression de fichiers dans le Dockerfile ne pas faire de votre image plus petite, consultez centurylinklabs.com/optimizing-docker-images/?hvid=4wO7Yt.
- est le courant dockerfile valide ?
- il ne peut pas. Il a été écrit, il a été écrit de 1,5 ans et beaucoup de choses ont changé depuis. Assurez-vous d'incorporer les modifications décrites dans la réponse choisie.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser Environnement De Remplacement dans votre
Dockerfile
comme suit:=
signe égal nécessaire?=
il doit être sans espaces. Si vous ajoutez des places à côté de=
comme ceENV PATH = "/opt/gtk/bin:${PATH}"
VA se planter VOTRE $PATHBien que la réponse que Gunter affichée est correcte, il n'est pas différent de ce que j'avais déjà posté. Le problème n'est pas le
ENV
directive, mais l'instruction ultérieureRUN export $PATH
Il n'y a pas besoin d'exporter les variables d'environnement, une fois que vous avez déclarés par
ENV
dans votre Dockerfile.Dès que le
RUN export ...
lignes ont été supprimées, mon image a été construit avec succèsRUN A=B
,RUN export A
, etRUN export A=B
, sont valables commandes du shell, mais affectent l'environnement que de commandes qui suivent dans ce mêmeRUN
directive (mais aucun n'est donné). De même, si vous aviezRUN export PATH=/foo; prog1; prog2;
(dans la même course), le CHEMIN d'accès de modification aurait une incidence surprog1
etprog2
. Donc,RUN export $PATH
est un noop (car aucun programme n'utilise que modifiée de l'environnement) et il devrait faire aucune différence si cette directive est là ou pas. Par "Gunter", entendez-vous cette réponse?Cela est déconseillé (si vous souhaitez créer et/ou distribuer un nettoyer le Panneau de l'image), depuis le
PATH
variable est définie par/etc/profile
script, la valeur peut être remplacée.head /etc/profile
:À la fin de la Dockerfile, vous pouvez ajouter:
Sorte de CHEMIN d'accès est défini pour tous les utilisateurs.
/etc/environment
une liste d'affectation des expressions, et non pas un script, et ne prend pas en charge l'expansion des variables, il est donc peu probable que leRUN
syntaxe de travail.export PATH=<some path>
sera écrit à/etc/environment
, qui n'est toujours pas correcte parce que le fichier n'est pas un script, mais une liste de<var name>=<value>
.export
sera susceptible de faire échouer, à moins que votre système prend en charge la magie noire à l'extérieur de la spécification.