Spaces:
Sleeping
Sleeping
| # ---- Builder Stage ---- | |
| FROM python:3.13.3-slim-bookworm AS builder | |
| WORKDIR /virtualenvs | |
| # Install uv | |
| COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ | |
| ENV PYTHONUNBUFFERED=1 \ | |
| PYTHONDONTWRITEBYTECODE=1 \ | |
| UV_COMPILE_BYTECODE=1 \ | |
| UV_LINK_MODE=copy \ | |
| PATH="/virtualenvs/.venv/bin:$PATH" | |
| # Copy dependency files | |
| COPY pyproject.toml uv.lock /virtualenvs/ | |
| # Install dependencies (excluding project itself) | |
| RUN --mount=type=cache,target=/root/.cache/uv \ | |
| cd /virtualenvs && \ | |
| uv sync --frozen --no-install-project | |
| # ---- Development Stage ---- | |
| FROM python:3.13.3-slim-bookworm AS development | |
| RUN useradd -m -u 1000 appuser | |
| WORKDIR /src | |
| ENV PYTHONUNBUFFERED=1 \ | |
| PYTHONDONTWRITEBYTECODE=1 \ | |
| VIRTUAL_ENV=/virtualenvs/.venv \ | |
| PATH="/virtualenvs/.venv/bin:$PATH" | |
| # Install system dependencies | |
| RUN apt-get update && apt-get install -y netcat-openbsd && rm -rf /var/lib/apt/lists/* | |
| # Install uv in the runtime stage | |
| COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ | |
| # Copy virtual environment from builder stage | |
| COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV} | |
| # Copy application code | |
| COPY . /src | |
| # Ensure permissions so non-root can read/execute env and write to repo dirs if needed | |
| RUN chown -R appuser:appuser /virtualenvs /src | |
| # Streamlit config: use the non-root user's home and disable telemetry writes | |
| ENV HOME=/home/appuser | |
| USER appuser | |
| EXPOSE 8501 | |
| HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health || exit 1 | |
| ENTRYPOINT ["streamlit", "run", "src/streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0", "--server.enableXsrfProtection=false"] |