docker build with --build-arg with multiple arguments
Asked Answered
B

7

437

According to the documentation, it's possible to define multiple args for the flag --build-arg, but I can't find out how. I tried the following:

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

=> This returns an error.

I also tried:

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

=> This sets one variable, number_of_shards, to the value "5,number_of_replicas=2"

Any idea how I can define multiple arguments?

Baumgartner answered 17/2, 2017 at 11:57 Comment(0)
H
871

Use --build-arg with each argument.

If you are passing two argument then add --build-arg with each argument like:

docker build \
-t essearch/ess-elasticsearch:1.7.6 \
--build-arg number_of_shards=5 \
--build-arg number_of_replicas=2 \
--no-cache .
Helicon answered 17/2, 2017 at 12:26 Comment(6)
Thanks for clearing this up. The --help on this is especially misleading: --build-arg list. It's not a list!Latvia
Maybe it's deprecated... I keep receiving "docker build" requires exactly 1 argument.Skerrick
The exactly 1 argument that's required is the directory (the . at the end of this example).Apples
For multiline --build-arg: https://mcmap.net/q/81856/-set-multiline-environment-variable-with-dockerfileCuriel
If that is the case then the documentation seems wrong. According to "docker build --help" the --build_arg is described as a list. it isn't really specifying a list if I have to repeat the entire argument over and over with a single value each time.Ribera
the "docker build" requires exactly 1 argument. error message is misleading! make sure the argument you're passing is not empty! (e.g. if you are injecting a variable into your docker build command). And as mentioned, you need a separate build-arg flag for each arg you want to pass.Bertrand
N
194

The above answer by pl_rock is correct, the only thing I would add is to expect the ARG inside the Dockerfile if not you won't have access to it. So if you are doing

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

Then inside the Dockerfile you should add

ARG number_of_replicas
ARG number_of_shards

I was running into this problem, so I hope I help someone (myself) in the future.

Needlecraft answered 1/8, 2017 at 19:17 Comment(5)
you helped me also, so thanks. Let me add only that ARGS must be declared after FROMJussive
Wow thanks! Using ARG is not even mentioned in docs.docker.com/engine/reference/commandline/build/… and --build-arg was useless for me without ARGIodate
Also useless for me before FROM... :-/Conducive
Note, if you plan to utilize the env variables once your container has started you use the same patters except your docker file will use ENV instead of ARG #39598425Decease
Lost way to many time with this. FYI, here is the documentation which states that ARG must be used after FROM (well it can for all step before FROM if I read correctly)Wavawave
V
73

If you want to use environment variable during build. Lets say setting username and password.

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

Terminal Command

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

Vesicate answered 26/2, 2019 at 13:53 Comment(1)
Beware that this leaves the secret values visible in the docker image using the docker history command.Gottlieb
T
19

It's a shame that we need multiple ARG too, it results in multiple layers and slows down the build because of that, and for anyone also wondering that, currently there is no way to set multiple ARGs per one line.

Theaterintheround answered 24/10, 2017 at 12:50 Comment(5)
this can be combined with multi stage builds to reduce layers on the final built imageKory
This doesn't answer the question of how to set multiple build args. With buildkit you won't see separate steps being performed, and with the classic build, those additional steps are not filesystem layers.Kilk
This answer can be misleading. What is true is that there is no way to set multiple arguments in one line. But, multiple args are definitely supported.Aestivate
Clarified the statementTheaterintheround
ARG instruction does not create a new layer in modern Docker. docs.docker.com/develop/develop-images/…Phenetidine
A
15

In case you want to pass automatically build arguments from a specific file, you can do it this way :

docker build  $(cat .my-env-file-name | while read line; do out+="--build-arg $line"; done; echo $out; out="") .
Archaize answered 8/4, 2021 at 9:50 Comment(3)
i cant figure out why but if you put quotes around the command substitution $() causes docker build to break. it loses the '=value' part. this was driving me nuts for a while here! any idea why?Ludwig
get_build_args() { for build_arg in "${BUILD_ARGS[@]}"; do out+="--build-arg $build_arg " done echo -n "$out" } i wrote this assuming BUILD_ARGS is an array with elements ARG_NAME=VALUE. it works well and when i echo the output its all there. however when substituted in to docker build if i put quotes around it then it breaks. really confusedLudwig
example: build_args=`get_build_args` echo $build_args echo "$build_args" docker build $build_args . docker build "$build_args" .Ludwig
S
8

A way to pass in build arguments from a file using xargs is as follows:

cat .MY_ENV_FILE | xargs printf -- '--build-arg %s\n' | xargs docker build -t MY_TAG .
Subordinary answered 12/2, 2022 at 0:55 Comment(1)
This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From ReviewObau
H
1

thanks to pl_rock. This syntax worked for me in my gitlab pipeline (running alpine linux):

  script:
    - echo "attempting a multi-line build"
    - |
      docker build \
      --build-arg USER=${USER} \
      --build-arg PASSWORD=${PASSWORD} \
      -t ${IMAGE} \
      -f Dockerfile .
    - echo "Great Success"
Hydrargyrum answered 12/2 at 18:35 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.