# ============================================================================= # UC Salary Analysis — Dev Container # ============================================================================= # This container lets you run Claude Code in a Docker container so it can't # access your file system. It also helps set things up for a web tool later, # and has the proper dependencies. Tested on Linux, should work on macOS too. # # Multi-stage build with two named targets: # # claude-code — Claude Code + Python data pipeline tools # for UCOP scraper refactor and classifier work # # webdev — All of the above + Node.js/Vite/React toolchain # for the interactive UC salary visualisation site # # BUILD # docker build --target claude-code -t uc-claude-code . # docker build --target webdev -t uc-webdev . # # RUN (Claude Code) # docker run -it --rm \ # -v $(pwd):/workspace \ # -e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \ # uc-claude-code # # RUN (web dev, with hot-reload on host port 5173) # docker run -it --rm \ # -v $(pwd):/workspace \ # -p 5173:5173 \ # uc-webdev # # The workspace is mounted at /workspace in all cases. # ============================================================================= ARG DEBIAN_FRONTEND=noninteractive ARG NODE_MAJOR=22 # ----------------------------------------------------------------------------- # Stage 0 — base: Debian trixie + common system deps # ----------------------------------------------------------------------------- FROM debian:trixie-slim AS base ARG DEBIAN_FRONTEND ARG NODE_MAJOR RUN apt-get update && apt-get install -y --no-install-recommends \ bash \ curl \ wget \ ca-certificates \ gnupg \ git \ git-lfs \ unzip \ jq \ ripgrep \ python3 \ python3-pip \ python3-venv \ python3-dev \ build-essential \ openssh-client \ && rm -rf /var/lib/apt/lists/* ENV VIRTUAL_ENV=/opt/venv RUN python3 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH" RUN pip install --no-cache-dir \ requests \ pandas \ matplotlib \ openpyxl # ----------------------------------------------------------------------------- # Stage 1 — claude-code: add Claude Code CLI # ----------------------------------------------------------------------------- FROM base AS claude-code ARG NODE_MAJOR # Install Node.js via nodesource signed apt repo # (the setup_*.x | bash method returns 404 as of 2025) RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key \ | gpg --dearmor -o /usr/share/keyrings/nodesource.gpg \ && echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] \ https://deb.nodesource.com/node_${NODE_MAJOR}.x nodistro main" \ > /etc/apt/sources.list.d/nodesource.list \ && apt-get update \ && apt-get install -y --no-install-recommends nodejs \ && rm -rf /var/lib/apt/lists/* RUN npm install -g @anthropic-ai/claude-code WORKDIR /workspace CMD ["bash"] # ----------------------------------------------------------------------------- # Stage 2 — webdev: add full frontend toolchain on top of claude-code # Exposes Vite at 5173 and FastAPI/uvicorn at 8000 to serve # JSON to the frontend for a future tool or smth.. # ----------------------------------------------------------------------------- FROM claude-code AS webdev RUN apt-get update && apt-get install -y --no-install-recommends \ libvips-dev \ procps \ && rm -rf /var/lib/apt/lists/* RUN pip install --no-cache-dir \ fastapi \ "uvicorn[standard]" \ pydantic EXPOSE 5173 EXPOSE 8000 WORKDIR /workspace CMD ["bash"]