En un Dockerfile, ¿cómo actualizar la variable de entorno PATH?
Tengo un archivo acoplable que descarga y compila GTK desde el código fuente, pero la siguiente línea no actualiza la variable de entorno de mi imagen:
RUN PATH="/opt/gtk/bin:$PATH"
RUN export PATH
Leí que debería usar ENV para establecer valores ambientales, pero la siguiente instrucción tampoco parece funcionar:
ENV PATH /opt/gtk/bin:$PATH
Este es mi Dockerfile completo:
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
Puede utilizar Reemplazo de entorno de Dockerfile
la siguiente manera:
ENV PATH="${PATH}:/opt/gtk/bin"
Aunque la respuesta que Gunter publicó fue correcta, no es diferente de lo que ya había publicado. El problema no fue la ENV
directiva, sino la instrucción posteriorRUN export $PATH
No es necesario exportar las variables de entorno una vez que las haya declarado ENV
en su Dockerfile.
Tan pronto como RUN export ...
se eliminaron las líneas, mi imagen se creó con éxito.
[ Mencioné esto en respuesta a la respuesta seleccionada, pero se sugirió hacerlo más destacado como una respuesta propia ]
se debe notar que
ENV PATH="/opt/gtk/bin:${PATH}"
puede que no sea el mismo que
ENV PATH="/opt/gtk/bin:$PATH"
El primero, con llaves, podría proporcionarle la RUTA del host . La documentación no sugiere que este sea el caso, pero he observado que así es. Esto es fácil de comprobar, simplemente hazlo RUN echo $PATH
y compáralo conRUN echo ${PATH}
Esto no se recomienda (si desea crear/distribuir una imagen de Docker limpia), ya que la PATH
variable se establece mediante /etc/profile
un script, el valor se puede anular.
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
Al final del Dockerfile, puedes agregar:
RUN echo "export PATH=$PATH" > /etc/environment
Entonces PATH está configurado para todos los usuarios.