Dockerfile.template 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. # Production Dockerfile Template
  2. # Customize for your application
  3. # ==============================================================================
  4. # Build Stage
  5. # ==============================================================================
  6. FROM python:3.11-slim AS builder
  7. WORKDIR /app
  8. # Install build dependencies (if needed)
  9. RUN apt-get update && apt-get install -y --no-install-recommends \
  10. build-essential \
  11. && rm -rf /var/lib/apt/lists/*
  12. # Create virtual environment
  13. RUN python -m venv /opt/venv
  14. ENV PATH="/opt/venv/bin:$PATH"
  15. # Install Python dependencies
  16. COPY requirements.txt .
  17. RUN pip install --no-cache-dir --upgrade pip \
  18. && pip install --no-cache-dir -r requirements.txt
  19. # ==============================================================================
  20. # Production Stage
  21. # ==============================================================================
  22. FROM python:3.11-slim
  23. WORKDIR /app
  24. # Install runtime dependencies only
  25. RUN apt-get update && apt-get install -y --no-install-recommends \
  26. # Add runtime dependencies here (e.g., libpq5 for postgres)
  27. curl \
  28. && rm -rf /var/lib/apt/lists/*
  29. # Copy virtual environment from builder
  30. COPY --from=builder /opt/venv /opt/venv
  31. ENV PATH="/opt/venv/bin:$PATH"
  32. # Create non-root user
  33. RUN groupadd --gid 1000 appgroup \
  34. && useradd --uid 1000 --gid appgroup --shell /bin/bash --create-home appuser
  35. # Set ownership
  36. RUN chown -R appuser:appgroup /app
  37. # Switch to non-root user
  38. USER appuser
  39. # Copy application code
  40. COPY --chown=appuser:appgroup src/ ./src/
  41. # Environment variables
  42. ENV PYTHONUNBUFFERED=1 \
  43. PYTHONDONTWRITEBYTECODE=1 \
  44. PORT=8000
  45. # Health check
  46. HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
  47. CMD curl -f http://localhost:${PORT}/health || exit 1
  48. # Expose port
  49. EXPOSE ${PORT}
  50. # Run application
  51. CMD ["python", "-m", "uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000"]