docker build с --build-arg с несколькими аргументами

206

Согласно документации , для флага можно определить несколько аргументов --build-arg, но я не могу понять, как это сделать. Я пробовал следующее:

docker build -t essearch/ess-elasticsearch:1.7.6 --build-arg number_of_shards=5 number_of_replicas=2 --no-cache .

=> Это возвращает ошибку.

Я также пробовал:

docker build -t essearch/ess-elasticsearch:1.7.6 --build-arg number_of_shards=5,number_of_replicas=2 --no-cache .

=> Это устанавливает одну переменную, number_of_shardsв значение "5, число_реплик = 2"

Есть идеи, как я могу определить несколько аргументов?

Эмильен Бриганд
источник

Ответы:

389

Используйте --build-argс каждым аргументом.

Если вы передаете два аргумента, добавьте --build-argкаждый аргумент, например:

docker build \
-t essearch/ess-elasticsearch:1.7.6 \
--build-arg number_of_shards=5 \
--build-arg number_of_replicas=2 \
--no-cache .
pl_rock
источник
67
Спасибо, что прояснили это. --helpНа это особенно в заблуждение: --build-arg list. Это не список!
cowlinator
100

Приведенный выше ответ pl_rock верен, единственное, что я хотел бы добавить, - это ожидать, что ARG будет внутри Dockerfile, если у вас не будет доступа к нему. Итак, если вы делаете

docker build -t essearch/ess-elasticsearch:1.7.6 --build-arg number_of_shards=5 --build-arg number_of_replicas=2 --no-cache .

Затем внутри Dockerfile вы должны добавить

ARG number_of_replicas
ARG number_of_shards

Я столкнулся с этой проблемой, поэтому надеюсь, что помогу кому-то (себе) в будущем.

Хавьер Перес
источник
7
Вы мне тоже помогли, так что спасибо. Позвольте мне добавить только то, что ARGSдолжно быть объявлено послеFROM
Эдоардо
7
Вау, спасибо! Использование ARGдаже не упоминается в docs.docker.com/engine/reference/commandline/build/… и --build-argбыло бесполезно для меня безARG
HeyWatchThis
22

Если вы хотите использовать переменную среды во время сборки. Допустим, установка имени пользователя и пароля.

username= Ubuntu
password= swed24sw

Dockerfile

FROM ubuntu:16.04
ARG SMB_PASS
ARG SMB_USER
# Creates a new User
RUN useradd -ms /bin/bash $SMB_USER
# Enters the password twice.
RUN echo "$SMB_PASS\n$SMB_PASS" | smbpasswd -a $SMB_USER

Терминальная команда

docker build --build-arg SMB_PASS=swed24sw --build-arg SMB_USER=Ubuntu . -t IMAGE_TAG

Факаббир Амин
источник
7
Помните, что при этом секретные значения остаются видимыми в образе докера с помощью docker historyкоманды.
Gary
иногда за лучший ответ получают только один голос! но вы очень хорошо это объяснили. Спасибо!
Дюпиндер Сингх
13

Жалко, что нам тоже нужно несколько ARG, это приводит к нескольким уровням и из-за этого замедляет сборку, и для тех, кто также задается вопросом, в настоящее время нет возможности установить несколько ARG.

v1adko
источник