У меня есть dockerfile
FROM centos:7
ENV foo=42
тогда я построю это
docker build -t my_docker .
и запустите его.
docker run -it -d my_docker
Можно ли передавать аргументы из командной строки и использовать их с if else в Dockerfile? Я имею в виду что-то вроде
FROM centos:7
if (my_arg==42)
{ENV=TRUE}
else:
{ENV=FALSE}
и строить с этим аргументом.
docker build -t my_docker . --my_arg=42
docker
dockerfile
nick_gabpe
источник
источник
RUN if [ "$arg" == "42" ]; then ENV=TRUE; else ENV=FALSE; fi
. Или если аргумент может отсутствовать:RUN if [ "x$arg" == "x42" ]; then ...
Ответы:
Это может выглядеть не так чисто, но у вас может быть свой Dockerfile (условный) следующим образом:
а затем создайте образ как:
docker build -t my_docker . --build-arg arg=45
или
docker build -t my_docker .
источник
[ "$arg" = "x" ]
вместо[ "x$arg" = "x" ]
?if [ $arg != "" ] ;
но я уверен, что есть кое-что, с чем я не знакомif [[ -n "$arg" ]]
истина, если параметр не пуст,if [[ -z "$arg" ]]
истина, если параметр пуст[ "x$arg" = "x" ]
похоже, что сравниваются две строки в кавычках, но кавычки удаляются; Это сохраняет правильный синтаксис. После цитаты зачистки: Хорошо:if x = x ..
. Плохо:if =
. ОДНАКО, ЕСТЬ лучшие способы проверить наличие параметра: Проверить наличие входных аргументов .По какой-то причине большинство ответов здесь мне не помогли (возможно, это связано с моим изображением FROM в Dockerfile)
Поэтому я предпочел создать
bash script
в своей рабочей области в сочетании с--build-arg
, чтобы обрабатывать оператор if во время сборки Docker, проверяя, является ли аргумент пустым или нетСценарий Bash:
Dockerfile:
Сборка Docker:
Примечание: это перейдет к else (false) в сценарии bash
Замечание: это перейдет к if (true)
Изменить 1:
После нескольких попыток я нашел следующую статью , и этот один , который помог мне понять 2 вещи:
1) ARG перед FROM находится вне сборки
2) Оболочка по умолчанию - / bin / sh, что означает, что if else работает немного по-другому в сборке докеров. например, для сравнения строк вам нужен только один "=" вместо "==".
Так что вы можете сделать это внутри
Dockerfile
и в
docker build
:источник
Согласно документу для
docker build
команды , есть параметр с именем--build-arg
.Пример использования:
ИМО это то что нужно :)
источник
Существует интересная альтернатива предлагаемым решениям, которая работает с одним Dockerfile , требует только одного вызова сборки Docker для каждой условной сборки и позволяет избежать bash .
Решение:
Следующее
Dockerfile
решает эту проблему. Скопируйте и вставьте его и попробуйте сами.Объяснение Dockerfile:
Сначала мы получаем
base
изображение (centos:7
в вашем случае) и помещаем его в отдельную сцену.base
Стадия должна содержать вещи , которые вы хотите сделать , прежде чем условия. После этого у нас есть еще два этапа, представляющие ветви нашего условия:branch-version-1
иbranch-version-2
. Мы строим их обоих.final
Этап , чем выбирает один из этих этапов, на основеmy_arg
. Условный Dockerfile. Вот так.Выход при работе:
(Я немного сократил это ...)
my_arg==2
my_var==1
Спасибо Тынису за эту замечательную идею!
источник
Просто используйте для этого непосредственно "тестовый" двоичный файл. Вы также должны использовать команду noop ":", если вы не хотите указывать условие "else", чтобы докер не остановился с ненулевой ошибкой возвращаемого значения.
источник
RUN [ -z "$YOURVAR" ] && ... || :
я полагаюRUN test -z "$YOURVAR" || echo "var is set" && echo "var is not set"
&&
перед||
:test ! -z "$YOURVAR" && echo "var is set" || echo "var is not set"
Точно, как говорили другие, сценарий оболочки поможет.
Просто дополнительный случай, ИМХО, стоит упомянуть (для кого-то, кто наткнется здесь, ищет более простой случай), то есть замена среды .
источник
Общепринятый ответ может решить этот вопрос, но если вы хотите многострочные
if
условия в dockerfile, вы можете сделать это размещение\
в конце каждой строки (подобно тому , как вы могли бы сделать в сценарии оболочки) и заканчивая каждую команду;
. Вы даже можете определить что-то вродеset -eux
как 1-ю команду.Пример:
В твоем случае:
Затем создайте с помощью:
источник
Использование сценария Bash и Alpine / Centos
Dockerfile
script.sh
Передача аргумента:
docker build -t test --build-arg MYARG="this is a test" .
Без аргумента:
docker build -t test .
источник