One of the most anticipated announcements in the Docker space when it comes to building images is Multi-Stage builds because of the huge benefits it gives to CI/CD pipelines in DevOps. Before this announcement, building software in a container usually involved creating a container with all the SDK’s and compilers in the container, uploading code into the container, compiling it, creating a drop, then building another container with just the runtime that sucks in the compiled code to run. This pattern required an external tool and storage to build the container image so it was more burdensome.
Multi-Stage builds on Docker though provide a mechanism for moving the output of a build from a builder container into another container that can be used for running. Consider the following the example. This Dockerfile builds a .NET core app in one container then packages it in another.
#Builder FROM microsoft/dotnet:1.1.2-sdk-jessie COPY /myapp /myapp RUN dotnet restore ./myapp && \ dotnet build -c release ./myapp && \ dotnet publish -c release -o pubdir ./myapp #Final Build FROM microsoft/dotnet:1.1.2-runtime COPY --from=0 /myapp/pubdir /myapp ENV ASPNETCORE_URLS http://+:80 ENTRYPOINT ["dotnet", "/myapp/myapp.dll"] EXPOSE 80
This file has two FROM instructions, which in a traditional Dockerfile only one is a allowed.… Read more