У меня есть dockerfile, который загружает и собирает GTK из исходного кода, но следующая строка не обновляет переменную окружения моего образа:
RUN PATH="/opt/gtk/bin:$PATH"
RUN export PATH
Я прочитал, что я должен использовать ENV для установки значений среды, но следующая инструкция, похоже, тоже не работает:
ENV PATH /opt/gtk/bin:$PATH
Это весь мой 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
Ответы:
Вы можете использовать замену среды в вашем
Dockerfile
следующем:источник
=
Нужен ли знак равенства?=
чтобы он был без пробелов. Если вы добавите пробелы рядом с таким,=
как это,ENV PATH = "/opt/gtk/bin:${PATH}"
будет$PATH
добавленным хостом?ENV PATH="/opt/gtk/bin:${PATH}"
может не совпадать с тем, чтоENV PATH="/opt/gtk/bin:$PATH"
первый, с фигурными скобками, может предоставить вам PATH хоста. Документация не предполагает, что это было бы так, но я заметил, что это так. Это просто проверить, просто сделайтеRUN echo $PATH
и сравните это сRUN echo ${PATH}
Хотя ответ, который выложил Гюнтер, был правильным, он не отличается от того, что я уже написал. Проблема была не в
ENV
директиве, а в последующей инструкцииRUN export $PATH
Нет необходимости экспортировать переменные среды, если вы объявили их через
ENV
свой Dockerfile.Как только
RUN export ...
линии были удалены, мое изображение было успешно построеноисточник
RUN A=B
,,RUN export A
иRUN export A=B
, являются допустимыми командами оболочки, но влияют на среду только тех команд, которые следуют в той жеRUN
директиве (но ни одна не указана). Точно так же, если бы вы имелиRUN export PATH=/foo; prog1; prog2;
(в том же RUN), модификация PATH затронула быprog1
иprog2
. Таким образом,RUN export $PATH
это noop (потому что ни одна программа не использует эту измененную среду), и не должно иметь значения, есть ли эта директива или нет. Под "Гюнтером" ты имеешь в виду этот ответ ?Это не рекомендуется (если вы хотите создать / распространить чистый образ Docker), так как
PATH
переменная устанавливается/etc/profile
скриптом, значение может быть переопределено.head /etc/profile
:В конце Dockerfile вы можете добавить:
Таким образом, PATH установлен для всех пользователей.
источник
/etc/environment
это список выражений присваивания, а не сценарий, и он не поддерживает расширение переменных, поэтому маловероятно, чтоRUN
синтаксис будет работать.export PATH=<some path>
будет записан/etc/environment
, что по-прежнему неверно, поскольку этот файл - не скрипт, а список<var name>=<value>
.export
скорее всего, он потерпит неудачу, если ваша система не поддерживает черную магию за пределами спецификации.