# Build stage FROM python:3.12-slim AS builder # Install uv COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv # Set working directory WORKDIR /app # Copy dependency files COPY pyproject.toml uv.lock ./ COPY src ./src # Create virtual environment and install dependencies RUN uv sync --no-dev --frozen # Runtime stage FROM python:3.12-slim AS runtime # Create non-root user RUN useradd --create-home --shell /bin/bash datacat # Set working directory WORKDIR /app # Copy virtual environment from builder COPY --from=builder /app/.venv /app/.venv # Copy application code COPY --chown=datacat:datacat src ./src # Set environment variables ENV PATH="/app/.venv/bin:$PATH" ENV PYTHONUNBUFFERED=1 ENV PYTHONDONTWRITEBYTECODE=1 # Switch to non-root user USER datacat # Health check - verify the app can at least parse args HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD python -m datacat --help > /dev/null 2>&1 || exit 1 # Default command ENTRYPOINT ["python", "-m", "datacat"] CMD []