Условный ENV в Dockerfile
Можно ли условно установить переменную ENV
в файле Docker на основе значения build ARG
?
Ex: что-то вроде
ARG BUILDVAR=sad
ENV SOMEVAR=if $BUILDVAR -eq "SO"; then echo "hello"; else echo "world"; fi
Обновление: текущее использование на основе ответа Марио:
ARG BUILD_ENV=prod
ENV NODE_ENV=production
RUN if [ "${BUILD_ENV}" = "test" ]; then export NODE_ENV=development; fi
Однако, работая с --build-arg BUILD_ENV=test
, а затем перейдя на хост, я все равно получаю
docker run -it mycontainer bin/bash
[[email protected] /]# echo $NODE_ENV
production
Ответы
Ответ 1
Да, это возможно, но вам нужно использовать аргумент сборки в качестве флага. Вы можете использовать функцию расширения параметров оболочки для проверки состояния. Вот файл Docker для проверки концепции:
FROM debian:stable
ARG BUILD_DEVELOPMENT
# if --build-arg BUILD_DEVELOPMENT=1, set NODE_ENV to 'development' or set to null otherwise.
ENV NODE_ENV=${BUILD_DEVELOPMENT:+development}
# if NODE_ENV is null, set it to 'production' (or leave as is otherwise).
ENV NODE_ENV=${NODE_ENV:-production}
Тестирование сборки:
docker build --rm -t env_prod ./
...
docker run -it env_prod bash
[email protected]:/# echo $NODE_ENV
production
[email protected]:/# exit
docker build --rm -t env_dev --build-arg BUILD_DEVELOPMENT=1 ./
...
docker run -it env_dev bash
[email protected]:/# echo $NODE_ENV
development
Ответ 2
Вы не можете запустить bash-код в Dockerfile напрямую, но вы должны использовать команду RUN
. Так, например, вы можете изменить ENV
с помощью RUN
и экспортировать переменную в if
, как показано ниже:
ARG BUILDVAR=sad
RUN if [ "$BUILDVAR" == "SO" ]; \
then export SOMEVAR=hello; \
else export SOMEVAR=world; \
fi
Я не пробовал это, но должно работать.
Ответ 3
Пока вы не можете установить условные переменные ENV
, но вы можете выполнить то, что вам нужно, с помощью команды RUN
и null-coalescing. переменная среды:
RUN node /var/app/current/index.js --env ${BUILD_ENV:-${NODE_ENV:-"development"}}
Ответ 4
Ваша логика действительно правильная.
Проблема здесь в том, что RUN export ...
не будет работать в файле Docker, потому что команда export
не будет сохраняться на изображениях.
Dockerfiles создают временный контейнер для создания изображения для него, поэтому переменные среды не будут существовать.
ENV
, с другой стороны, согласно documentation:
Переменные среды, заданные с помощью ENV
, сохраняются, когда контейнер запускается из полученного изображения.
Единственный способ сделать это - во время вашей команды docker run
при создании контейнера из вашего изображения и обернуть свою логику вокруг этого:
if [ "${BUILD_ENV}" = "test" ]; then
docker run -e NODE_ENV=development myimage
else
docker run myimage
fi
Ответ 5
Передача значений в файл Docker, а затем в точку входа script
Из командной строки перейдите в требуемое значение (TARG)
docker run --env TARG=T1_WS01 -i projects/msbob
Затем в Dockerfile
поставьте что-то вроде этого
Dockerfile:
# if $TARG is not set then "entrypoint" defaults to Q0_WS01
CMD ./entrypoint.sh ${TARG} Q0_WS01
entrypoint.sh
script только считывает первый аргумент
entrypoint.sh:
#!/bin/bash
[ $1 ] || { echo "usage: entrypoint.sh <$TARG>" ; exit ; }
target_env=$1