Pirobits
  

¿Qué es Docker multi-stage build?

alberto avatar Alberto Sola · 3/29/2023

El sistema de construcción de imágenes docker basado en diferentes etapas o multi-stage build es útil ya que te permite organizar y optimizar mejor los dockerfiles: por un lado divides la construcción de una imagen de Docker en diferentes partes relacionadas, lo que hace más fácil el mantenimiento y la actualización de la imagen en el futuro. Por otro lado puedes reducir el tamaño de la imagen final, ya que cada etapa puede generar su propia capa en la imagen, evitando incluir dependencias innecesarias.

Para utilizar esta feature de docker, simplemente tienes que utilizar múltiples secciones FORM en tu Dockerfile. Puedes utilizarlo a partir de la versión 17.05 de Docker.

Existen dos sistemas de construcción de imágenes: el sistema legacy de construcción de imágenes y el nuevo buildkit. La principal diferencia es bastante importante en cuanto a optimización: el sistema legacy construye todos los stages del Dockerfile, incluso aunque no se utilicen, mientras que buildkit únicamente construye los stages que son necesarios para construir el target en cuestión.

A continuación podrás ver un caso práctico

Caso práctico

Creación de una imagen de node para producción, que tenga las mínimas dependencias y tamaño posible.

Lo primero es crear dos etapas: - En la primera copio todo mi proyecto, instalo todas las dependencias (incluidas las necesarias para desarrollo) y genero un build de nuestro código (por ejemplo compilando typescript). - En la segunda etapa instalo únicamente las dependencias de producción, y copio únicamente la carpeta build de la etapa anterior, minimizando el tamaño de la imagen final.

FROM node:18-alpine3.17 AS base
WORKDIR /app

COPY . .
RUN npm ci
RUN npm run build

FROM node:18-alpine3.17 AS production
WORKDIR /app
USER node

COPY --chown=node:node package.json .
COPY --chown=node:node package-lock.json .
RUN npm ci --production

COPY --from=base --chown=node:node /app/build .

CMD ["node", "/app/index.js"]

Para construir tu dockerfile, ejecuta el comando:

docker build -t app .

Si tienes múltiples stages y quieres construir uno anterior en concreto, por ejemplo el de desarrollo:

FROM node:18-alpine3.17 AS base
...

FROM base AS development
...

FROM node:18-alpine3.17 AS production
...

Puedes especificar qué stage quieres con la opción --target. Por ejemplo:

docker build --target develop -t app .

Bibliografía

¿Te ha resultado útil este artículo? Suscríbete a mi newsletter y da el primer paso para lanzar productos IT más rápido. Recibirás consejos exclusivos que te acercarán a tus objetivos.


Lo último que he escrito en el blog