Pirobits
  

¿Qué es Docker multi-stage build?

alberto avatar Alberto Sola · 3/29/2023 · 2 min

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

Si te ha resultado útil este artículo agradecería si te suscribes a mi newsletter. Recibirás contenido exclusivo de calidad y también me ayudarás enormemente. Cada suscripción apoya el trabajo que realizo y me permite conocer mejor los temas que te interesan, de forma que puedo mejorar los conocimientos que comparto contigo.


Posts recientes