How to define a variable in a Dockerfile?

后端 未结 6 1176
情歌与酒
情歌与酒 2020-12-07 16:02

In my Dockerfile, I would like to define variables that I can use later in the Dockerfile.

I am aware of the

相关标签:
6条回答
  • 2020-12-07 16:40

    Late to the party, but if you don't want to expose environment variables, I guess it's easier to do something like this:

    RUN echo 1 > /tmp/__var_1
    RUN echo `cat /tmp/__var_1`
    RUN rm -f /tmp/__var_1
    

    I ended up doing it because we host private npm packages in aws codeartifact:

    RUN aws codeartifact get-authorization-token --output text > /tmp/codeartifact.token
    RUN npm config set //company-123456.d.codeartifact.us-east-2.amazonaws.com/npm/internal/:_authToken=`cat /tmp/codeartifact.token`
    RUN rm -f /tmp/codeartifact.token
    

    And here ARG cannot work and i don't want to use ENV because i don't want to expose this token to anything else

    0 讨论(0)
  • 2020-12-07 16:41

    To my knowledge, only ENV allows that, as mentioned in "Environment replacement"

    Environment variables (declared with the ENV statement) can also be used in certain instructions as variables to be interpreted by the Dockerfile.

    They have to be environment variables in order to be redeclared in each new containers created for each line of the Dockerfile by docker build.

    In other words, those variables aren't interpreted directly in a Dockerfile, but in a container created for a Dockerfile line, hence the use of environment variable.


    This day, I use both ARG (docker 1.10+, and docker build --build-arg var=value) and ENV.
    Using ARG alone means your variable is visible at build time, not at runtime.

    My Dockerfile usually has:

    ARG var
    ENV var=${var}
    

    In your case, ARG is enough: I use it typically for setting http_proxy variable, that docker build needs for accessing internet at build time.

    0 讨论(0)
  • 2020-12-07 16:41

    You can use ARG variable defaultValue and during the run command you can even update this value using --build-arg variable=value. To use these variables in the docker file you can refer them as $variable in run command.

    Note: These variables would be available for Linux commands like RUN echo $variable and they wouldn't persist in the image.

    0 讨论(0)
  • 2020-12-07 16:42

    You can use ARG - see https://docs.docker.com/engine/reference/builder/#arg

    The ARG instruction defines a variable that users can pass at build-time to the builder with the docker build command using the --build-arg <varname>=<value> flag. If a user specifies a build argument that was not defined in the Dockerfile, the build outputs an error.

    0 讨论(0)
  • 2020-12-07 16:42

    If the variable is re-used within the same RUN instruction, one could simply set a shell variable. I really like how they approached this with the official Ruby Dockerfile.

    0 讨论(0)
  • 2020-12-07 16:46

    To answer your question:

    In my Dockerfile, I would like to define variables that I can use later in the Dockerfile.

    You can define a variable with:

    ARG myvalue=3
    

    Spaces around the equal character are not allowed.

    And use it later with:

    RUN echo $myvalue > /test
    
    0 讨论(0)
提交回复
热议问题