FROM python:3.13-slim # ── System dependencies ──────────────────────────────────────────────────────── # Includes Xvfb/VNC stack, git (needed for pip's git+https installs), # and Chromium runtime libs (for the playwright-managed Chromium binary). RUN apt-get update && apt-get install -y --no-install-recommends \ xvfb \ x11vnc \ websockify \ novnc \ curl \ git \ libnss3 \ libatk1.0-0 \ libatk-bridge2.0-0 \ libcups2 \ libdrm2 \ libxkbcommon0 \ libxcomposite1 \ libxdamage1 \ libxrandr2 \ libgbm1 \ libpango-1.0-0 \ libcairo2 \ libasound2 \ libxshmfence1 \ libgtk-3-0 \ fonts-liberation \ && rm -rf /var/lib/apt/lists/* # ── Node.js 22.x ────────────────────────────────────────────────────────────── RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ && apt-get install -y --no-install-recommends nodejs \ && rm -rf /var/lib/apt/lists/* # ── npm global tools: @playwright/cli + Chrome ──────────────────────────────── # @playwright/cli — token-efficient browser CLI used by research agents # (playwright-cli -s=research open/snapshot/click/type …) # playwright-cli defaults to Chrome at /opt/google/chrome/chrome. Install it directly. RUN npm install -g @playwright/cli \ && curl -fsSL https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -o /tmp/chrome.deb \ && apt-get update && apt-get install -y /tmp/chrome.deb \ && rm -f /tmp/chrome.deb && rm -rf /var/lib/apt/lists/* # ── Python tooling ──────────────────────────────────────────────────────────── RUN pip install uv # overlayfs inside Docker doesn't support reflinks → use copy mode to avoid EAGAIN ENV UV_LINK_MODE=copy # ── amplifierd: Amplifier session daemon ────────────────────────────────────── # Not on PyPI — source is github.com/microsoft/amplifierd. # uv pip --system installs to /usr/local/bin/amplifierd (on PATH by default). # # amplifier-foundation is also not on PyPI (it's a pure git package that # amplifierd depends on), so we install it explicitly in the same step. # amplifier-core IS on PyPI and will be resolved automatically. RUN uv pip install --system \ "amplifierd @ git+https://github.com/microsoft/amplifierd" \ "amplifier-module-provider-anthropic @ git+https://github.com/microsoft/amplifier-module-provider-anthropic" # ── Frontend: install deps and build ────────────────────────────────────────── # Copy package manifests first so npm ci is cached independently of source changes. COPY frontend/package.json frontend/package-lock.json /app/frontend/ WORKDIR /app/frontend RUN npm ci COPY frontend/ /app/frontend/ RUN npm run build # ── Backend: install Python deps ────────────────────────────────────────────── COPY backend/pyproject.toml backend/uv.lock /app/backend/ WORKDIR /app/backend RUN uv sync --frozen # ── Application files ───────────────────────────────────────────────────────── COPY backend/*.py /app/backend/ COPY bundle/ /app/bundle/ COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh RUN mkdir -p /app/artifacts WORKDIR /app EXPOSE 8080 6080 ENV DISPLAY=:99 ENV AMPLIFIERD_URL=http://localhost:8410 ENV BUNDLE_NAME=research-workbench ENTRYPOINT ["/entrypoint.sh"]