Middle
¿En qué casos se utiliza una compilación de múltiples etapas?
sobes.tech AI
Respuesta de la IA
La construcción de múltiples etapas (multi-stage build) en Docker se utiliza en los siguientes casos:
- Reducción del tamaño de la imagen final: En la primera (o intermedia) capa de construcción se encuentran las herramientas necesarias para compilar, realizar pruebas u otras etapas de construcción (por ejemplo, compilador, dependencias de construcción). En la segunda (final) capa, solo se copian los artefactos necesarios para ejecutar la aplicación (código compilado, archivos ejecutables, bibliotecas de tiempo de ejecución). Esto evita incluir dependencias y herramientas de construcción innecesarias en la imagen final, reduciendo significativamente su tamaño.
- Separación de etapas de construcción y ejecución: La clara separación en etapas facilita la comprensión del proceso de construcción y su depuración. Se pueden tener etapas para compilar el código fuente, ejecutar pruebas, realizar linting y solo luego crear la imagen final con la aplicación lista para desplegar.
- Mejora de la seguridad: La imagen final contiene la cantidad mínima necesaria de componentes, lo que reduce la superficie de ataque. Las herramientas de construcción y el código fuente, que podrían contener vulnerabilidades, no se incluyen en la imagen utilizada en producción.
- Aceleración de la construcción (en algunos casos): Las imágenes intermedias pueden almacenarse en caché, y al realizar cambios solo en las últimas etapas de construcción, no es necesario reconstruir todo desde cero.
- Unificación del proceso de construcción: La construcción de la aplicación y la creación de su imagen Docker se convierten en un proceso automatizado único dentro de un Dockerfile, lo que simplifica los pipelines de CI/CD.
Ejemplo de uso para una aplicación en Go:
# Etapa de construcción
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
# Compilación del archivo ejecutable
RUN go build -ldflags="-s -w" -o myapp .
# Etapa final
FROM alpine:latest
WORKDIR /app
# Copiamos solo el archivo ejecutable de la etapa anterior
COPY --from=builder /app/myapp .
# Especificamos el comando para ejecutar la aplicación
CMD ["./myapp"]