Este nuevo feature de docker se introdujo en la versión 17.05 y es muy poderoso. Al principio me costó un poco de trabajo entender para que sirve o cuales son los beneficios de usar stages. Para tratar de explicar esto de una manera más sencilla; vamos a usar como ejemplo mi blog. Actualmente estoy usando jekyll, una gema de Ruby. Sin embargo; el resultado final está solamente compuesto de archivos HTML; por lo tanto, nuestra imagen final no necesita tener Ruby, solo necesitamos Ruby para generar los archivos HTML. Yo solía hace hacer este tipo de builds usando 2 imágenes de docker, una para hacer build y la otra como la final. Otro ejemplo muy claro es cuando se usa un SPA de React; generar los archivos estáticos necesita de Node.js pero la imagen final no requiere de Node.js en absoluto. ¿Para que necesito hacer imagen con multi-stages? La respuesta es simple; seguridad y una imagen de menor tamaño. Así se ve una la imagen para una app con jekyll:

FROM ruby:2.6.6-alpine AS build

WORKDIR /build

COPY . .

RUN apk update && \
    apk add --update --no-cache build-base && \
    rm -rf /var/cache/apk/*

RUN gem install bundler:2.2.1

RUN bundle install

RUN rm -rf _site && bundle exec jekyll build

FROM nginx:alpine AS final

WORKDIR /public

COPY --from=build /build/_site .

RUN mv /public/nginx.conf /etc/nginx/nginx.conf