Как изменить Docker ENV var?

при строительстве Dockerfile, Я часто разрешаю настраивать аргументы во время сборки, чтобы упростить настройку только немного разных контейнеров. Для этого я использую значения по умолчанию для ENV vars в сочетании с определяемым пользователем ARGs. Пример Dockerfile для быстрого тестирования с:

FROM busybox
ARG FLAGS
ENV FLAGS ${FLAGS:-}
RUN echo "${FLAGS}"

это тогда можно использовать так:

docker build --build-arg FLAGS="foo --remove-me" -t <imagename>:<tag> .

теперь я нахожусь в ситуации, когда я хочу активно удалить определенный флаг (в приведенном выше примере: --remove-me) из команды, которую я разрешаю запускать (из-за ошибки, не исправленной более года). Хотя я знаю, как удалить флаг в других ситуациях:

LC_ALL=C sed -e 's/ --remove-me//'

я сталкиваюсь с проблемой, что я понятия не имею, как трубить и удалять флаг. Я знаю, что могу сделать это при использовании RUN, но тогда мне придется повторить выше sed использование для каждого RUN заявление, поэтому и не повторимый.

2 ответов


после прочтения о замене переменной Shell в этой AskUbuntu ответ, я попробовал:

ENV FLAGS ${FLAGS//--fully-static/}

однако я столкнулся со следующей ошибкой:

Missing ':' in substitution: "${FLAGS:-}" | "${FLAGS//--fully-static/}"

сначала я узнал, что Docker поддерживает только ограниченный бит bash методы замены переменных. Наконец, я смог найти на Докер GitHub РЕПО где ясно, что : должны быть там, где активно убивает любые усилия, идущие по этому пути прямо на первом этапе.


выполнить в той же проблеме. Мой обходной путь:

используйте login shell для чтения .профиль:

# need docker >= 1.12
SHELL ["bash", "--login", "-c"]

создать новую переменную среды с подстановкой:

RUN echo "export PROXY_HOST_IP=${PROXY_HOST#"http://"}" >> ${HOME}/.profile