¿Cómo utilizas la construcción multinivel (multistage) para optimizar las imágenes de Docker?
sobes.tech AI
Respuesta de la IA
La compilación en múltiples etapas permite utilizar varias fases (layers) en un Dockerfile, donde cada fase realiza su propia tarea. El resultado de una fase (por ejemplo, un artefacto compilado) se pasa a la siguiente, pero las capas intermedias de las fases anteriores no se incluyen en la imagen final.
Ejemplo de uso para compilar una aplicación Go:
# Fase de compilación
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp
# Fase final
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]
Ventajas:
- Reducción del tamaño de la imagen: En la imagen final solo se incluye la aplicación compilada y las dependencias necesarias, no las herramientas de compilación, el código fuente ni los archivos intermedios.
- Separación de preocupaciones: La lógica de compilación/desarrollo se separa de la lógica de despliegue.
- Mayor seguridad: Se reduce la superficie de ataque al excluir herramientas y bibliotecas innecesarias de la imagen final.
- Aceleración de compilaciones: El almacenamiento en caché de capas entre etapas puede acelerar las recompilaciones.
Por ejemplo, en el Dockerfile proporcionado, la primera capa builder se usa para compilar la aplicación Go. La segunda capa, que comienza con FROM alpine:latest, copia solo la aplicación compilada desde la primera capa (COPY --from=builder /app/myapp /app/) en una imagen base limpia. Como resultado, la imagen final contiene solo el archivo ejecutable y el sistema operativo base, sin el compilador de Go ni el código fuente.
Esto reduce significativamente el tamaño de la imagen en comparación con el enfoque tradicional, donde la compilación y la ejecución ocurren en un solo contenedor.