Como usar docker build stages
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