Dockerización Multi-Stage
Tarea a realizar
Separar el proceso de dockerización anterior en 2 fases:
-
Build(construcción)
- Generar la web (site/)
-
Run (producción)
- Solo sirve la web estática
sin Python
sin mkdocs/zensical
sin código fuente
¿Qué es la dockerización?
En lugar de meter todo (herramientas de compilación + app final) como haces en la dockerización normal, en una sola imagen, pues haces algo así:
Stage de build: Incluye compiladores, dependencias pesadas, etc. (solo para construir la app).
Stage final: Copias solo lo necesario (el resultado ya compilado) a una imagen mucho más ligera.
¿Para que sirve?
- Reducir tamaño de la imagen (mucho más ligera)
- Mejorar seguridad (sin herramientas innecesarias)
- Optimizar despliegue (descargas más rápidas)
- Mantener limpio el entono final
Ejemplo:
# Stage 1: build
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
# Stage 2: producción
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
Aquí:
- El primer Stage contruye la app
- El segundo solo copia el resultado final
Estructura 
proyecto/
├── docs/
| ├── index.md
| └── ... <-- (los demás archivos que tengas)
├── mkdocs.yml
├── requirements.txt
└── Dockerfile <-- (hay que crearlo, pero ahora el multi-stage)
Dockerfile
El archivo que tenemos q crear contendrá lo siguiente:
Puedes ayudarte de la guía haciendo clic en el enlace.
En cuanto al requirements.txt en mi caso lo tendría de la siguiente forma, lo más importante aquí es que tengamos el zensical para q no haya problemas.
Dockerización.
Contruimos la imagen con
Ejecutamos el contenedor en nuestro caso 8086:80
- 8086 porque es el que hemos especificado en el archivo Dockerfile
"EXPOSE 8086" - 80 porque es en el que sirve el contenedor de nginx por defecto y no lo hemos cambiado
Comprobamos que funciona correctamente accediendo por el puerto que especificamos http://localhost:8086


