docker-compose up --buildThis will:
- Build and start the FastAPI backend on
http://localhost:8000 - Build and start the Next.js frontend on
http://localhost:3000
- Frontend: http://localhost:3000
- Backend API: http://localhost:8000
- API Documentation: http://localhost:8000/docs
# Build all services
docker-compose build
# Build specific service
docker-compose build backend
docker-compose build frontend# Start all services in detached mode
docker-compose up -d
# View logs
docker-compose logs -f
# Stop services
docker-compose down
# Stop and remove volumes
docker-compose down -v- Base Image:
python:3.11.9-slim-bullseye - Size: Optimized slim variant (~200MB)
- Security: Runs as non-root user (appuser)
- Health Check: Included
- Build Stage:
node:20.13-alpine - Runtime Stage:
node:20.13-alpine - Size: Multi-stage build optimized (~150MB)
- Security: Runs as non-root user (appuser)
- Health Check: Included
✅ Pinned base image versions (no :latest tags)
✅ Pinned all Python and Node.js dependency versions
✅ Multi-stage build for frontend (smaller production image)
✅ Used --no-install-recommends for minimal dependencies
✅ Non-root user for security
✅ Health checks for both services
✅ Layer caching optimization (dependencies copied first)
✅ .dockerignore for smaller context
For production, consider:
-
Use Docker registry to store pinned images by digest:
docker build --tag myregistry/neuro-backend:v1.0.0 ./Backend docker push myregistry/neuro-backend:v1.0.0
-
Reference by digest in docker-compose or orchestration:
image: myregistry/neuro-backend@sha256:abc123...
-
Environment variables: Use
.envfile for production secrets:docker-compose --env-file .env.production up
- Check if backend is healthy:
docker-compose ps - View logs:
docker-compose logs backend
- Ensure backend service name is
backendin requests - Verify
NEXT_PUBLIC_API_URLenvironment variable
# Change ports in docker-compose.yml or run on different port
docker-compose -p myapp up# Remove containers and networks
docker-compose down
# Remove images too
docker-compose down --rmi all
# Remove volumes
docker-compose down -v