Подтвердить что ты не робот

Условный 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
4b9b3361

Ответ 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