Makefile so you don’t need to remember raw docker compose invocations. This is the same setup used in the Quickstart — this page covers the rest of the day-to-day commands.
Services
Two services make up the stack:app— the Laravel application, serving on port8000. The image includes PCOV, so PHP test coverage works without extra setup.vite— the frontend dev server, serving assets and HMR on port5173.
.env.docker rather than .env — see Configuration for what each variable does.
Common commands
Running tests in Docker
Troubleshooting: stale Vite HMR
If hot reload stops working and the browser console shows WebSocket errors, the file watcher inside thevite container has likely desynced from the filesystem — this is more common when the repo lives on non-native storage (for example, an external or removable drive), since Vite falls back to polling (server.watch.usePolling in vite.config.js) rather than native filesystem events across Docker bind mounts.
1
Restart the containers
2
If that doesn't fix it, rebuild from scratch
This isn’t fixed by raising the
fs.inotify.max_user_watches kernel limit — that sysctl is global, not per-container, so Docker won’t start a container that tries to set it per-service. Polling is the mechanism actually in effect here, and a restart forces a fresh full re-scan.