dockerdockerfiledocker-builddocker-multi-stage-build

How do I copy variables between stages of multi stage Docker build?


I've only seen examples of using COPY to copy files between stages of a multi stage Dockerfile, but is there a way to simply copy an ENV variable? My use case is to start out with a git image to just to get the commit hash that will be part of the build. The image I'm later building with hasn't got git.

I realise I could just pipe out the git hash to a file and use COPY but I'm just wondering if there's a cleaner way?


Solution

  • You got 3 options: The "ARG" solution, the "base"-stage solution, and "file" solution.

    "ARG" solution

    ARG version_default=v1
    
    FROM alpine:latest as base1
    ARG version_default
    ENV version=$version_default
    RUN echo ${version}
    RUN echo ${version_default}
    
    FROM alpine:latest as base2
    ARG version_default
    RUN echo ${version_default}
    

    "base"-stage solution

    another way is to use base container for multiple stages:

    FROM alpine:latest as base
    ARG version_default
    ENV version=$version_default
    
    FROM base
    RUN echo ${version}
    
    FROM base
    RUN echo ${version}
    

    You can find more details here: https://github.com/moby/moby/issues/37345

    "file" solution

    Save the hash into a file in the first stage, copy it in the second stage, and then read it and use it there.