On my last post I described how to use a single
ARG with a list of packages to be installed on an alpine image.
But what happens when your Dockefile contains a multitude of
BUILD ARGS that you wish to pass along the build from a single file that contains them.
Let’s check an rather simple Dockerfile what I’m trying to explain here.
1 2 3 4 5 6 7 8 9 10 11 12 13 FROM python:latest ARG ARG_1=first_argument ARG ARG_2=second_argument ARG ARG_3=third_argument ARG ARG_4=fourth_argument ARG ARG_12=first_second_argument ARG ARG_22=second_second_argument ARG ARG_32=third_second_argument ARG ARG_42=fourth_second_argument ARG ARG_13=first_third_argument ARG ARG_23=second_third_argument ARG ARG_33=third_third_argument ARG ARG_43=fourth_third_argument
If you wan’t to override all this arguments using the
--build-arg would require you to have the following command (or similar)
1 2 docker build -t custom:stuff --build-arg ARG_1=1st --build-arg ARG_2=2nd --build-arg ARG_3=3rd ... #you get the point
Now imagine you would want to have those build args defined in a file similar to a
env_file that you wish to use in order to have different multiple builds, for staging production etc.. , as that would be much more pratical.
–build-arg with multiple arguments from file with bash
This could obvisouly be achieved on many other terminal interpreters, for simplicity and since my main OS is usually Linux with bash as interpreter, I’ve done it in bash
Now let’s create a file named
build.args with the following contents
1 2 3 4 5 6 7 8 9 10 11 12 ARG_1=1st ARG_2=2nd ARG_3=3rd ARG_4=4th ARG_12=1st2nd ARG_22=2nd2nd ARG_32=3rd2nd ARG_42=4th2nd ARG_13=1st3rd ARG_23=2nd3rd ARG_33=3rd3rd ARG_43=4th3rd
Now, how to use this
build.args to build an image and its respective build args from this file.
1 docker build -t custom:stuff $(for i in `cat build.args`; do out+="--build-arg $i " ; done; echo $out;out="") .
It might not be the simplest single line command to read, but when using on CI/CD pipeline for instance, you could have multiple build environments from multiple files, while also avoiding a train of
--build-arg in the shell.