Saltar al contenido principal

Cómo Optimizar el Tamaño de tu Imagen Docker

Reducí el tamaño de las imágenes Docker y mejorá los tiempos de build usando imágenes base Alpine, builds multi-stage y .dockerignore — haciendo tus imágenes más rápidas de descargar, desplegar y más seguras.

Por Qué Importa el Tamaño de la Imagen

Las imágenes más pequeñas significan tiempos de pull más rápidos, despliegues más ágiles, menor costo de almacenamiento en el registry, y una superficie de ataque reducida con menos paquetes instalados.

Técnica 1 — Usar Imágenes Base Alpine o Slim

En lugar de una imagen base completa, usar una alternativa mínima:

# Antes — imagen grande
FROM node:20

# Después — mucho más pequeña
FROM node:20-alpine

Imágenes base mínimas comunes:

RuntimeImagen mínima
Node.jsnode:20-alpine
Pythonpython:3.12-slim
Javaeclipse-temurin:21-jre-alpine
Goscratch o gcr.io/distroless/static
aviso

Alpine usa musl libc en lugar de glibc. Algunos paquetes se comportan diferente. Probá tu aplicación exhaustivamente al cambiar.

Técnica 2 — Builds Multi-Stage

Usar una etapa para construir y una etapa mínima separada para el runtime:

# Etapa de build — tiene todas las herramientas
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Etapa de runtime — solo lo necesario para correr
FROM node:20-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
CMD ["node", "dist/index.js"]

Esto mantiene herramientas de build, código fuente y archivos intermedios fuera de la imagen final.

Técnica 3 — Usar .dockerignore

Prevenir que archivos innecesarios sean enviados al build context:

# .dockerignore
node_modules
.git
.env
*.log
dist
coverage
.DS_Store
README.md

Un build context más pequeño acelera cada docker build.

Técnica 4 — Ordenar Capas para Eficiencia de Cache

Docker cachea las capas. Ponés las capas que cambian frecuentemente al final para maximizar los cache hits:

# Bien — dependencias cacheadas separadas del código fuente
COPY package*.json ./
RUN npm ci
COPY . . # los cambios de fuente no invalidan el cache de npm ci

# Mal — npm ci se re-ejecuta en cada cambio de fuente
COPY . .
RUN npm ci

Técnica 5 — Eliminar Archivos Innecesarios Post-Instalación

RUN apk add --no-cache algún-paquete

Resumen

TécnicaImpacto
Imágenes base Alpine/slimReducción de tamaño 3–10x
Builds multi-stageElimina herramientas de build y fuente de la imagen final
.dockerignoreBuilds más rápidos, sin filtrado accidental de secretos
Orden de capasBuilds incrementales más rápidos por reutilización del cache
Limpieza post-instalaciónElimina caches del gestor de paquetes