kompilacja dokera z opcją --build-arg z wieloma argumentami

193

Zgodnie z dokumentacją możliwe jest zdefiniowanie wielu argumentów dla flagi --build-arg, ale nie mogę się dowiedzieć, jak to zrobić. Próbowałem następujące:

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

=> Zwraca błąd.

Próbowałem także:

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

=> Ustawia jedną zmienną number_of_shardsna wartość „5, number_of_replicas = 2”

Masz pomysł, jak zdefiniować wiele argumentów?

Emilien Brigand
źródło

Odpowiedzi:

358

Użyj --build-argz każdym argumentem.

Jeśli przekazujesz dwa argumenty, dodaj --build-argdo każdego argumentu, np .:

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
źródło
63
Dzięki za wyjaśnienie tego. --helpNa ten temat jest szczególnie mylące: --build-arg list. To nie jest lista!
cowlinator
91

Powyższa odpowiedź od pl_rock jest poprawna, jedyne, co chciałbym dodać, to oczekiwać ARG w pliku Docker, jeśli nie, nie będziesz mieć do niego dostępu. Więc jeśli robisz

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

Następnie wewnątrz Dockerfile powinieneś dodać

ARG number_of_replicas
ARG number_of_shards

Napotkałem ten problem, więc mam nadzieję, że pomogę komuś (sobie) w przyszłości.

Javier Perez
źródło
6
też mi pomogłeś, więc dziękuję. Dodam tylko, że ARGSnależy to zadeklarować poFROM
Edoardo,
6
Wow dzięki! Korzystanie ARGnie jest nawet wspomniane w docs.docker.com/engine/reference/commandline/build/... i --build-argbyło dla mnie bezużyteczne bezARG
HeyWatchThis
19

Jeśli chcesz użyć zmiennej środowiskowej podczas kompilacji. Powiedzmy, że ustawienie nazwy użytkownika i hasła.

username= Ubuntu
password= swed24sw

Plik Docker

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

Polecenie terminalu

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

Fakabbir Amin
źródło
3
Uwaga: pozostawia to tajne wartości widoczne w obrazie dokera za pomocą docker historypolecenia.
Gary
czasami jedyna najlepsza odpowiedź jest pozytywnie oceniona! ale wyjaśniłeś to bardzo dobrze. Dziękuję Ci!
Dupinder Singh,
14

Szkoda, że ​​potrzebujemy również wielu ARG, powoduje to wiele warstw i spowalnia kompilację z tego powodu, a dla każdego, kto się nad tym zastanawia, obecnie nie można ustawić wielu ARG.

v1adko
źródło