- Estado: Aceptada. Reemplaza en parte al ADR-0025 en la organización de los archivos de Compose.
- Fecha: 2026-10-31
Contexto
Hasta ahora, docker compose up -d cargaba solo el docker-compose.override.yml, que era el modo desarrollo: el código montado desde la carpeta del equipo, Vite sin empaquetar y PHP revisando si cambió algún archivo en cada petición.
En Windows y macOS la carpeta montada es lenta para Docker. Se midió así:
- La pantalla de ingreso pedía 84 archivos sueltos y tardaba unos 3,6 s.
- Cada petición a la API tardaba de 0,4 a 1,5 s.
Ese es el comando del README, y quien evalúe la prueba en Windows habría visto una app lenta que no refleja la real.
Alternativas evaluadas
- Que
docker compose up -dlevante las imágenes finales y que el modo desarrollo pase a un archivo opcional. - Mantener el modo desarrollo por defecto y levantar las imágenes finales a mano solo para revisar.
- Afinar el modo desarrollo (que PHP revise menos seguido los archivos).
Decisión
docker-compose.yml(base, sin cambios): las imágenes finales. Es el build de Vue servido por Nginx con la CSP estricta, y la API con el código y las dependencias dentro de la imagen, sin revisar archivos.docker-compose.override.yml(se carga solo): solo los extras locales que no cambian lo que ve quien usa Trazo. Mailpit y los perfiles opcionaleszapydocs.docker-compose.dev.yml(nuevo, opcional): el modo desarrollo de antes, con el código montado, Vite con recarga en caliente, Composer, Pest, Pint, Larastan y PCOV. Se activa con:
También se puede dejar fijo en undocker compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.dev.yml up -d.envlocal conCOMPOSE_FILE.- Datos de demostración sin Faker: la imagen final no trae las dependencias de desarrollo, y Faker es una de ellas. Los seeders pasan a usar el generador de PHP (
Random\Randomizercon semilla fija) enDemoRandom. Los datos siguen siendo los mismos en cada máquina y Faker queda solo para las factories de las pruebas. - CI: el trabajo del backend usa el modo desarrollo, porque necesita Pest, Larastan y PCOV. La E2E corre contra el modo final, con el mismo build y la misma CSP que verá quien use Trazo.
- Gancho de Pint: corre en un contenedor de un solo uso con la imagen de desarrollo. Así funciona sea cual sea el modo del stack.
Alternativas descartadas
- Modo final solo para revisar: quien evalúe seguiría viendo la versión lenta con el comando del README. Además, cambiar de modo a mano cada vez es fácil de olvidar.
- Afinar el modo desarrollo: mejora algo la API, pero no la cantidad de archivos que pide el navegador. El problema de fondo es leer el código desde la carpeta del equipo, y eso no cambia.
- Mover Faker a las dependencias de producción: resuelve los seeders, pero mete una librería de desarrollo en la imagen final. El generador de PHP hace lo mismo sin dependencias.
Consecuencias
-
docker compose up -dmuestra la velocidad real. Medido en local (Windows, Docker Desktop), con los mismos datos:Modo desarrollo Modo final Pantalla de ingreso (carga completa) ~3,6 s, 84 archivos ~0,13 s, 29 archivos Petición a la API (sesión, catálogos, dashboard, listado) 0,4–1,5 s 20–80 ms -
Un cambio en el código no se ve en el modo final hasta reconstruir (
docker compose up -d --build). Para trabajar en el código se usa el modo desarrollo. -
La guía visual solo existe en el modo desarrollo. La E2E la revisa solo si el stack corre en ese modo.
-
composer check,composer coveragey los comandos de prueba del back necesitan el modo desarrollo. -
El primer arranque construye las imágenes finales, y el build del front tarda unos minutos más que antes.
Dónde está en el código
docker-compose.yml,docker-compose.override.ymlydocker-compose.dev.yml.backend/database/seeders/Support/DemoRandom.php..github/workflows/ci.yml:COMPOSE_FILEdel trabajo del backend.lefthook.yml: Pint en un contenedor de un solo uso.frontend/e2e/accessibility.spec.ts: la guía visual solo en el modo desarrollo.