Dockerizacion Multi-stage
Construcción en múltiples etapas para contenedores Elixir de menos de 50MB en Cloud Run
Técnica estándar de la industria para desplegar aplicaciones Elixir en producción: Multi-stage Build.
Usando un Dockerfile tradicional de una sola etapa, el contenedor final mide entre 600MB y 1GB por arrastrar el compilador de Elixir, herramientas de C, Git y código fuente. Con multi-stage, el contenedor en Cloud Run pesa menos de 50MB.
El secreto: Separación entre etapas
Section titled “El secreto: Separación entre etapas”Etapa 1: El Taller Sucio (AS builder)
Section titled “Etapa 1: El Taller Sucio (AS builder)”- Imagen pesada
elixir:1.16-alpine - Herramientas:
gcc,make,git(apk add build-base git) - Se descargan dependencias y se compila todo
mix releaseproduce una carpeta compacta con binarios.beammás la BEAM VM minificada
Etapa 2: El Quirófano Limpio (AS runner)
Section titled “Etapa 2: El Quirófano Limpio (AS runner)”- Docker borra todo de la Etapa 1
- Arranca desde
alpinelimpia (~5MB) - Instala solo
opensslyncurses(lo que Erlang necesita) - Copia exclusivamente el release compilado:
COPY --from=builder /app/_build/prod/rel/tlw ./¿Por qué funciona en Elixir?
Section titled “¿Por qué funciona en Elixir?”El código Elixir se compila a bytecode precalculado (no se interpreta como JS o Python). El release final lleva su propio motor BEAM incluido. bin/tlw start arranca la MV sin necesidad de Elixir ni Mix instalados.
Los 3 beneficios
Section titled “Los 3 beneficios”- Cold Starts instantáneos en Cloud Run — 45MB se descargan en
<1svs 800MB que tardan 20-30s - Seguridad — Sin código fuente, sin
git/curl/mixpara scripts maliciosos, corre comonobody - Costo de almacenamiento — Imágenes pequeñas en Artifact Registry cuestan casi nada