# Stage 1: Builder FROM python:3.14 AS builder WORKDIR /app # Install build dependencies RUN pip install --no-cache-dir setuptools wheel # Copy pyproject.toml first for better layer caching COPY pyproject.toml ./ # Copy source code COPY app/ ./app/ COPY backup/ ./backup/ COPY alembic/ ./alembic/ COPY alembic.ini ./ # Build the package with dev dependencies RUN pip install --no-cache-dir -e ".[dev]" # Stage 2: Runtime FROM python:3.14-slim WORKDIR /app # Create non-root user RUN groupadd -r backup-tool && useradd -r -g backup-tool backup-tool # Copy installed packages from builder COPY --from=builder /usr/local/lib/python3.14/site-packages/ /usr/local/lib/python3.14/site-packages/ COPY --from=builder /usr/local/bin/ /usr/local/bin/ # Copy application code COPY --from=builder /app/ ./ # Create data directory for SQLite and backups RUN mkdir -p /app/data /app/backups && \ chown -R backup-tool:backup-tool /app USER backup-tool # Expose port EXPOSE 8000 # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/health')" || exit 1 # Default command CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]