Skip to content

Instantly share code, notes, and snippets.

@aaronbbrown
Last active April 14, 2017 23:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aaronbbrown/6bd7f01e316cdf0bcabc155ccde5798f to your computer and use it in GitHub Desktop.
Save aaronbbrown/6bd7f01e316cdf0bcabc155ccde5798f to your computer and use it in GitHub Desktop.
Dockerfile ARGs vs ENVs

During the build process, building a Dockerfile w/ a default build ARG and ENV outputs:

BUILD MYENV: 'THIS IS AN ENV VARIABLE' MYARG: 'THIS IS A BUILD ARGUMENT'

$ docker build --no-cache  -t example .
Sending build context to Docker daemon 2.048 kB
Step 1/5 : FROM alpine
 ---> 88e169ea8f46
Step 2/5 : ENV MYENV "THIS IS AN ENV VARIABLE"
 ---> Running in c0adeeeb7a68
 ---> 763493b4b68f
Removing intermediate container c0adeeeb7a68
Step 3/5 : ARG MYARG="THIS IS A BUILD ARGUMENT"
 ---> Running in 4c48a5f5c796
 ---> 757fc76c5902
Removing intermediate container 4c48a5f5c796
Step 4/5 : RUN echo "BUILD MYENV: '$MYENV' MYARG: '$MYARG'"
 ---> Running in 9802a49fdf43
BUILD MYENV: 'THIS IS AN ENV VARIABLE' MYARG: 'THIS IS A BUILD ARGUMENT'
 ---> 12c21d5e94ff
Removing intermediate container 9802a49fdf43
Step 5/5 : CMD echo "RUN MYENV: '$MYENV' MYARG: '$MYARG'"
 ---> Running in 64bafa99ee21
 ---> 3a81c0c880b7
Removing intermediate container 64bafa99ee21
Successfully built 3a81c0c880b7

Build ARGs can be overridden and appear in the environment:

$ docker build --build-arg MYARG="OVERRIDDEN BUILD ARG" --no-cache  -t example .
Sending build context to Docker daemon 2.048 kB
Step 1/5 : FROM alpine
 ---> 88e169ea8f46
Step 2/5 : ENV MYENV "THIS IS AN ENV VARIABLE"
 ---> Running in effb24d964e6
 ---> c61052dabe8c
Removing intermediate container effb24d964e6
Step 3/5 : ARG MYARG="THIS IS A BUILD ARGUMENT"
 ---> Running in 91718ee98c3a
 ---> 0b5f8982c89d
Removing intermediate container 91718ee98c3a
Step 4/5 : RUN echo "BUILD MYENV: '$MYENV' MYARG: '$MYARG'"
 ---> Running in 111d8a443792
BUILD MYENV: 'THIS IS AN ENV VARIABLE' MYARG: 'OVERRIDDEN BUILD ARG'
 ---> 2d02795454d9
Removing intermediate container 111d8a443792
Step 5/5 : CMD echo "RUN MYENV: '$MYENV' MYARG: '$MYARG'"
 ---> Running in cac5859ee406
 ---> f08b6505cf49
Removing intermediate container cac5859ee406
Successfully built f08b6505cf49

ENV vars cannot be overridden at build time:

$ docker build --env MYENV="This is an overridden build ENV" --no-cache -t example .
unknown flag: --env
See 'docker build --help'.

At runtime, ARGs are not available, but the default ENV is injected into the environment:

$ docker run --rm --name example example
RUN MYENV: 'THIS IS AN ENV VARIABLE' MYARG: ''

ENV variables can be overridden at run time:

$ docker run --env MYENV="OVERRIDDEN ENV" --rm --name example example
RUN MYENV: 'OVERRIDDEN ENV' MYARG: ''
#!/usr/bin/env sh
if [ "$(hostname)" = "foo.example.com" ]; then
BAR="BAZ"
else
BAR="BIFF"
fi
docker run --build-arg MYARG="$BAR" build -t example .
FROM alpine
ENV MYENV="THIS IS AN ENV VARIABLE"
ARG MYARG="THIS IS A BUILD ARGUMENT"
RUN echo "BUILD MYENV: '$MYENV' MYARG: '$MYARG'"
CMD echo "RUN MYENV: '$MYENV' MYARG: '$MYARG'"
#!/usr/bin/env sh
if [ "$(hostname)" = "foo.example.com" ]; then
BAR="BAZ"
else
BAR="BIFF"
fi
docker run --env MYENV="$BAR" --rm --name example example
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment