Можно ли установить переменную ENV для докеров в результате выполнения команды? Подобно:
ENV MY_VAR whoami
я хочу, чтобы MY_VAR получил значение "root" или что-то еще, что возвращает whoami
dockerfile
env
Султанен
источник
источник
Ответы:
Как дополнение к DarkSideF ответ.
Вы должны знать, что каждая строка / команда в Dockerfile запускается в другом контейнере.
Вы можете сделать что-то вроде этого:
Это выполняется в одном контейнере.
источник
$bleah
это не доступны в любом месте за пределами этой команды RUN, даже не на следующей строке в том же dockerfile, не говоря уже о другом изображении он основан прочь. Здесь действительно очевидная отсутствующая функция в докере, похоже, что запись и чтение из файла - это единственный способ на самом деле хранить (динамические) переменные в изображениях и передавать их между изображениями, что кажется супер хакерским.У меня была такая же проблема, и я нашел способ установить переменную среды как результат функции с помощью команды RUN в файле dockerfile.
Например, мне нужно установить SECRET_KEY_BASE для приложения Rails только один раз, не меняя, как при запуске:
Вместо этого я пишу в строку Dockerfile, например:
и моя переменная env доступна из root, даже после входа в bash. или, может быть
тогда это переменная, доступная в командах CMD и ENTRYPOINT
Docker кеширует его как слой и изменяет только если вы измените некоторые строки перед ним.
Вы также можете попробовать разные способы установки переменной окружения.
источник
*.sh
файл внутри/etc/profile.d/
используется для заполнения средыВ настоящее время результат команды можно использовать с переменной
RUN export
, но нельзя присвоить ейENV
.Известная проблема: https://github.com/docker/docker/issues/29110
источник
Этот ответ является ответом на @DarkSideF ,
Предлагаемый им метод заключается в следующем
Dockerfile
:( добавление экспорта в
/etc/bash.bashrc
)Это хорошо, но переменная среды будет доступна только для процесса
/bin/bash
, и если вы попытаетесь запустить приложение докера, например приложение Node.js, оно/etc/bash.bashrc
будет полностью проигнорировано, и ваше приложение не будет иметь ни единой подсказки, чтоSECRET_KEY_BASE
происходит при попытке для доступаprocess.env.SECRET_KEY_BASE
.Вот почему
ENV
ключевое слово - это то, что все пытаются использовать с динамической командой, потому что каждый раз, когда вы запускаете свой контейнер или используетеexec
команду, Docker будет проверятьENV
и передавать каждое значение в текущем процессе (аналогично-e
).Одно из решений - использовать оболочку (кредит @duglin в этом выпуске на github ). Имейте файл-оболочку (например
envwrapper
) в корне вашего проекта, содержащий:а затем в вашем
Dockerfile
:источник
В дополнение к ответу @ DarkSideF, если вы хотите повторно использовать результат предыдущей команды в своем
Dockerfile
во время процесса сборки , вы можете использовать следующий обходной путь:Например :
Для чего-то более чистого вы также можете использовать следующую суть, которая предоставляет небольшой CLI с именем
envstore.py
:Или вы можете использовать библиотеку python-dotenv с аналогичным интерфейсом командной строки.
источник
Не уверен, что это то, что вы искали, но для внедрения переменных ENV или ARGS в вашу сборку .Dockerfile этот шаблон работает.
в вашем my_build.sh:
для получения ARG в вашем .Dockerfile фрагмент может выглядеть так:
в качестве альтернативы для получения ENV в вашем .Dockerfile фрагмент может выглядеть так:
идея заключается в том, что вы запускаете сценарий оболочки, который вызывает файл .Dockerfile с аргументами, переданными в качестве параметров сборки.
источник