docker build com --build-arg com vários argumentos

192

De acordo com a documentação , é possível definir vários argumentos para o sinalizador --build-arg, mas não consigo descobrir como. Eu tentei o seguinte:

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

=> Isso retorna um erro.

Eu também tentei:

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

=> Isso define uma variável number_of_shards,, para o valor "5, número_de_replicas = 2"

Alguma idéia de como posso definir vários argumentos?

Emilien Brigand
fonte

Respostas:

355

Use --build-argcom cada argumento.

Se você estiver passando dois argumentos, adicione --build-argcada um deles como:

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
fonte
62
Obrigado por esclarecer isso. A --helpsobre isso é especialmente enganosa: --build-arg list. Não é uma lista!
cowlinator
91

A resposta acima do pl_rock está correta, a única coisa que gostaria de acrescentar é esperar o ARG dentro do Dockerfile, caso contrário você não terá acesso a ele. Então, se você está fazendo

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

Em seguida, dentro do Dockerfile, você deve adicionar

ARG number_of_replicas
ARG number_of_shards

Eu estava enfrentando esse problema, então espero ajudar alguém (eu) no futuro.

Javier Perez
fonte
6
você me ajudou também, então obrigado. Deixe-me acrescentar apenas que ARGSdeve ser declarado depoisFROM
Edoardo
6
Uau, obrigado! Usando ARGnem sequer é mencionado em docs.docker.com/engine/reference/commandline/build/... e --build-argera inútil para mim semARG
HeyWatchThis
19

Se você deseja usar a variável de ambiente durante a construção. Vamos dizer definindo nome de usuário e senha.

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

Comando do Terminal

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

Fakabbir Amin
fonte
3
Cuidado, pois isso deixa os valores secretos visíveis na imagem da janela de encaixe, usando o docker historycomando
Gary
às vezes a única resposta principal é votada! mas você explicou isso muito bem. Obrigado!
Dupinder Singh
13

É uma pena que também precisamos de vários ARGs, isso resulta em várias camadas e diminui a compilação por causa disso, e para quem também se pergunta, atualmente não há como definir vários ARGs.

v1adko
fonte