# Stage 1: Builder FROM python:3.11-slim-bookworm AS builder COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvbin/uv WORKDIR /app ENV UV_CACHE_DIR=/app/.cache/uv COPY pyproject.toml uv.lock ./ COPY packages/common ./packages/common COPY apps/dashboard ./apps/dashboard # Create a VALID dummy for the other workspace member for validation RUN mkdir -p apps/pipeline-api/pipeline_api && \ echo '[project]\nname = "pipeline_api"\nversion = "0.1.0"\n[build-system]\nrequires = ["hatchling"]\nbuild-backend = "hatchling.build"' > apps/pipeline-api/pyproject.toml # Install dependencies into the virtualenv RUN /uvbin/uv sync --frozen --no-dev --package dashboard # Stage 2: Final FROM python:3.11-slim-bookworm WORKDIR /app # Copy project configuration for uv run COPY pyproject.toml uv.lock ./ # Copy only necessary parts from builder COPY --from=builder /app/.venv /app/.venv COPY --from=builder /app/packages/common /app/packages/common COPY --from=builder /app/apps/dashboard /app/apps/dashboard COPY --from=builder /uvbin/uv /usr/local/bin/uv # Create output directory with proper permissions RUN mkdir -p output && chmod -R 777 output EXPOSE 8501 ENV STREAMLIT_BROWSER_GATHER_USAGE_STATS=false ENV STREAMLIT_USAGE_STATS_ENABLED=false ENV PATH="/app/.venv/bin:$PATH" # --no-sync is required as we don't have the uv cache in the final image CMD ["uv", "run", "--frozen", "--no-sync", "--package", "dashboard", "streamlit", "run", "apps/dashboard/dashboard/app.py", "--server.port", "8501", "--server.address", "0.0.0.0"]