En este reto vamos a seguir trabajando con la misma aplicación de retos anteriores: el catálogo web de modelos UVL.
Vamos a simular que vamos a hacer un despliegue primero en preproducción y después en producción. Lo vamos a hacer utilizando máquinas virtuales. Primero realizaremos a mano la instalación en cada máquina. Después el proceso se repite usando contenedores en esas máquinas.
El objetivo es comprobar que el entorno forma parte de la configuración, observar el problema del environment drift, entender qué aporta el aislamiento, y reconocer que los contenedores reducen la incertidumbre al transportar la aplicación junto con sus dependencias.
5.1. Preparación previa
Vas a tener que descargar dos máquinas Ubuntu sin interfaz gráfica que representan los entornos de preproducción y producción. En ambas se trabajará con la misma copia del repositorio. Las credenciales son las siguientes:
- Usuario: egcstudent
- Contraseña: egcp4ssw0rd
Preparar el proyecto en cada máquina
Clona el repositorio en cada máquina y entra en él antes de crear el entorno virtual:
git clone https://github.com/EGCETSII/minireto-05-uvl-aislamiento.git
cd minireto-05-uvl-aislamiento
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -r requirements-dev.txt
python3 validate.py
python3 -m pytest
Las pruebas y la validación normal deben pasar en las dos máquinas.
5.2. Desplegar sin contenedor en preproducción
GENERATE_DIAGRAMS=1 python3 build.py
En preproducción debe terminar correctamente y generar, además de index.html, diagramas SVG dentro de site/.
Comprobar la dependencia
which dot
dot -V
dot es el ejecutable de Graphviz que build.py invoca para crear diagramas.
5.3. Repetir en producción
GENERATE_DIAGRAMS=1 python3 build.py
En producción se espera un fallo similar a FileNotFoundError: no se encuentra dot. El código y los datos son iguales; la diferencia está en el estado previo de la máquina.
Comprobar el diagnóstico
which dot
dot -V
El comando no encontrará dot. Esto confirma que la aplicación tenía una dependencia del sistema no incluida en requirements-dev.txt.
El hecho de que funcionara en preproducción no demostraba que el despliegue fuera reproducible. La máquina ya contenía conocimiento y software que el repositorio no describía.
5.4. Inspeccionar el Dockerfile
FROM python:3.12-slim
RUN apt-get update && apt-get install -y --no-install-recommends graphviz \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY . .
CMD ["python", "build.py"]
La dependencia que antes estaba escondida en preproducción aparece ahora declarada explícitamente en la receta de la imagen.
5.5. Construir la imagen
Construye la imagen en las dos máquinas, preproducción y producción: cada una necesita su propia copia local de la imagen.
docker build -t uvl-catalog .
La construcción parte de una imagen base que ya incluye Python, instala Graphviz y copia la aplicación.
5.6. Ejecutar en preproducción
rm -rf site
mkdir site
docker run --rm \
-e GENERATE_DIAGRAMS=1 \
-v "$PWD/site:/app/site" \
uvl-catalog
El volumen permite que la salida generada dentro del contenedor quede disponible en la carpeta site/ de la máquina anfitriona.
5.7. Ejecutar en producción
Repite exactamente la misma orden en producción (con la imagen ya construida en esa máquina en el paso 5.5):
rm -rf site
mkdir site
docker run --rm \
-e GENERATE_DIAGRAMS=1 \
-v "$PWD/site:/app/site" \
uvl-catalog
Ahora también funciona, aunque el host de producción siga sin tener dot instalado. El proceso usa el Graphviz incluido en la imagen.
5.8. Qué ha quedado aislado y qué no
Rellena la siguiente tabla:
| Queda dentro de la imagen | Sigue dependiendo del entorno anfitrión |
|---|---|
Un contenedor reduce incertidumbre, pero no crea independencia absoluta. La práctica muestra una mejora concreta: la dependencia Graphviz deja de ser un detalle accidental de una máquina.
5.9. Evidencias de la actividad
- Log del
buildcorrecto en preproducción sin contenedor. - Log del fallo en producción sin contenedor.
- Comprobación de la ausencia de
doten producción. - Ejecución correcta de la imagen en ambas máquinas.
- Respuesta razonada sobre qué encapsula la imagen y qué sigue fuera de ella.