Eu tenho um dockerfile que baixa e cria o GTK a partir da fonte, mas a seguinte linha não está atualizando a variável de ambiente da minha imagem:
RUN PATH="/opt/gtk/bin:$PATH"
RUN export PATH
Eu li que eu deveria estar usando ENV para definir valores de ambiente, mas a instrução a seguir também não parece funcionar:
ENV PATH /opt/gtk/bin:$PATH
Este é o meu Dockerfile inteiro:
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
Respostas:
Você pode usar a substituição de ambiente no
Dockerfile
seguinte:fonte
=
sinal de igual é necessário?=
que precisa ser sem espaços. Se você adicionar espaços ao lado=
como estaENV PATH = "/opt/gtk/bin:${PATH}"
vai travar o seu $ PATH$PATH
anexados?ENV PATH="/opt/gtk/bin:${PATH}"
pode não ser o mesmo queENV PATH="/opt/gtk/bin:$PATH"
O primeiro, com colchetes, pode fornecer o CAMINHO do host. A documentação não sugere que esse seria o caso, mas observei que sim. Isso é simples de verificar, basta fazerRUN echo $PATH
e compará-lo comRUN echo ${PATH}
Embora a resposta que Gunter postou fosse correta, não é diferente do que eu já havia postado. O problema não era a
ENV
diretiva, mas a instrução subsequenteRUN export $PATH
Não há necessidade de exportar as variáveis de ambiente, depois que você as declarar
ENV
no Dockerfile.Assim que as
RUN export ...
linhas foram removidas, minha imagem foi criada com sucessofonte
RUN A=B
,,RUN export A
eRUN export A=B
, são comandos válidos do shell, mas afetam o ambiente apenas dos comandos que seguem na mesmaRUN
diretiva (mas nenhum é fornecido). Da mesma forma, se você tivesseRUN export PATH=/foo; prog1; prog2;
(no mesmo RUN), a modificação PATH afetariaprog1
eprog2
. Portanto,RUN export $PATH
é um noop (porque nenhum programa usa esse ambiente modificado) e não deve fazer diferença se essa diretiva existe ou não. Por "Gunter", você quer dizer esta resposta ?Isso é desencorajado (se você deseja criar / distribuir uma imagem limpa do Docker), uma vez que a
PATH
variável é definida por/etc/profile
script, o valor pode ser substituído.head /etc/profile
:No final do Dockerfile, você pode adicionar:
Portanto, PATH está definido para todos os usuários.
fonte
/etc/environment
há uma lista de expressões de atribuição, não um script, e não suporta expansão de variáveis, portanto, é improvável que aRUN
sintaxe funcione.export PATH=<some path>
gravado/etc/environment
, o que ainda está incorreto porque esse arquivo não é um script, mas uma lista de<var name>=<value>
.export
provavelmente fará com que ela falhe, a menos que seu sistema suporte alguma magia negra fora das especificações.