skip to Main Content

I am learning how to use ARG and ENV in Dockerfiles.
I have this simple Dockerfile:

ARG my_arg
ARG other_arg=other_default

FROM centos:7

ENV MY_ENV $my_arg
ENV OTHER_ENV $other_arg

CMD echo "$MY_ENV $OTHER_ENV"

When I build it:
docker build --build-arg my_arg=my_value

And run it:
docker run <resulting-image>

I do not see the expected output, which would be

my_value other_default

Instead, I see the empty string.
What am I doing wrong?

2

Answers


  1. In a Dockerfile, each FROM line starts a new image, and generally resets the build environment. If your image needs to specify ARGs, they need to come after the FROM line; if it’s a multi-stage build, they need to be repeated in each image as required. ARG before the first FROM are only useful to allow variables in the FROM line, but can’t be used otherwise.

    This is further discussed under Understand how ARG and FROM interact in the Dockerfile documentation.

    FROM centos:7
    
    # _After_ the FROM line
    ARG my_arg
    ARG other_arg=other_default
    ...
    
    Login or Signup to reply.
  2. At least since 20.10.2, ARGs can be passed from outside the FROM line onwards, all you need to do is insert another ARG with the same name after the FROM:

    ARG my_arg
    ARG other_arg=other_default
    
    FROM centos:7
    
    # These need to be re-stated here to use the ARGs above.
    ARG my_arg
    ARG other_arg # This will be populated with the default value 'other_default'.
    
    ENV MY_ENV $my_arg
    ENV OTHER_ENV $other_arg
    
    CMD echo "$MY_ENV $OTHER_ENV"
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search