# Build with: # docker compose -f packages/evals/docker-compose.yml build runner # Test with: # docker compose -f packages/evals/docker-compose.yml run --rm runner bash FROM debian:bookworm-slim AS base # Install system packages (excluding language runtimes - those come from mise) RUN apt-get update && \ apt-get install -y \ curl \ git \ vim \ jq \ netcat-openbsd \ apt-transport-https \ ca-certificates \ gnupg \ lsb-release \ wget \ gpg \ xvfb \ cmake \ build-essential \ && rm -rf /var/lib/apt/lists/* # Install Docker cli RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \ && apt-get update && apt-get install -y docker-ce-cli \ && rm -rf /var/lib/apt/lists/* # Install VS Code RUN wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg \ && install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg \ && echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" | tee /etc/apt/sources.list.d/vscode.list > /dev/null \ && rm -f packages.microsoft.gpg \ && apt-get update && apt-get install -y code \ && rm -rf /var/lib/apt/lists/* WORKDIR /roo # Install mise (https://mise.jdx.dev) for language runtime management RUN curl https://mise.run | sh \ && /root/.local/bin/mise --version # Set up mise environment ENV MISE_DATA_DIR="/root/.local/share/mise" ENV PATH="/root/.local/share/mise/shims:/root/.local/bin:$PATH" # Define language runtime versions (matching setup.sh) ARG NODE_VERSION=20.19.2 ARG PYTHON_VERSION=3.13.2 ARG GO_VERSION=1.24.2 ARG RUST_VERSION=1.85.1 ARG JAVA_VERSION=openjdk-17 ARG UV_VERSION=0.7.11 # Install language runtimes via mise RUN mise use --global node@${NODE_VERSION} \ && mise use --global python@${PYTHON_VERSION} \ && mise use --global go@${GO_VERSION} \ && mise use --global rust@${RUST_VERSION} \ && mise use --global java@${JAVA_VERSION} \ && mise use --global uv@${UV_VERSION} \ && mise reshim # Verify installations RUN node --version && python --version && go version && rustc --version && java --version && uv --version # Install pnpm (after node is available from mise) ENV PNPM_HOME="/root/.local/share/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN npm install -g pnpm npm-run-all # Install VS Code extensions ARG GOLANG_EXT_VERSION=0.46.1 ARG ESLINT_EXT_VERSION=3.0.10 ARG JAVA_EXT_VERSION=1.42.0 ARG PYTHON_EXT_VERSION=2025.6.1 ARG RUST_EXT_VERSION=0.3.2482 RUN mkdir -p /roo/.vscode-template \ && yes | code --no-sandbox --user-data-dir /roo/.vscode-template --install-extension golang.go@${GOLANG_EXT_VERSION} \ && yes | code --no-sandbox --user-data-dir /roo/.vscode-template --install-extension dbaeumer.vscode-eslint@${ESLINT_EXT_VERSION} \ && yes | code --no-sandbox --user-data-dir /roo/.vscode-template --install-extension redhat.java@${JAVA_EXT_VERSION} \ && yes | code --no-sandbox --user-data-dir /roo/.vscode-template --install-extension ms-python.python@${PYTHON_EXT_VERSION} \ && yes | code --no-sandbox --user-data-dir /roo/.vscode-template --install-extension rust-lang.rust-analyzer@${RUST_EXT_VERSION} # Copy evals ARG EVALS_COMMIT=main ARG EVALS_REPO_URL=https://github.com/RooCodeInc/Roo-Code-Evals.git RUN git clone ${EVALS_REPO_URL} evals \ && cd evals \ && git checkout ${EVALS_COMMIT} # Pre-warm Gradle wrapper cache (./gradlew downloads its own Gradle regardless of system install). # Find a Java project with gradlew and run it to cache the distribution. RUN find /roo/evals -name "gradlew" -type f | head -1 | xargs -I {} sh -c 'cd $(dirname {}) && ./gradlew --version' # Sync python dependencies for evals WORKDIR /roo/evals/python RUN uv sync WORKDIR /roo/repo # Install npm packages RUN mkdir -p \ scripts \ apps/cli \ packages/build \ packages/config-eslint \ packages/config-typescript \ packages/core \ packages/evals \ packages/ipc \ packages/telemetry \ packages/types \ packages/cloud \ packages/vscode-shim \ src \ webview-ui COPY ./package.json ./ COPY ./pnpm-lock.yaml ./ COPY ./pnpm-workspace.yaml ./ COPY ./scripts/bootstrap.mjs ./scripts/ COPY ./apps/cli/package.json ./apps/cli/ COPY ./packages/build/package.json ./packages/build/ COPY ./packages/config-eslint/package.json ./packages/config-eslint/ COPY ./packages/config-typescript/package.json ./packages/config-typescript/ COPY ./packages/core/package.json ./packages/core/ COPY ./packages/evals/package.json ./packages/evals/ COPY ./packages/ipc/package.json ./packages/ipc/ COPY ./packages/telemetry/package.json ./packages/telemetry/ COPY ./packages/types/package.json ./packages/types/ COPY ./packages/cloud/package.json ./packages/cloud/ COPY ./packages/vscode-shim/package.json ./packages/vscode-shim/ COPY ./src/package.json ./src/ COPY ./webview-ui/package.json ./webview-ui/ RUN pnpm install # Copy source code COPY . ./ # Validate that .env.local exists and is not empty RUN if [ ! -f "packages/evals/.env.local" ] || [ ! -s "packages/evals/.env.local" ]; then \ echo "ERROR: packages/evals/.env.local is missing or empty. Please create it with your API keys before building."; \ exit 1; \ fi # Copy ENV secrets COPY packages/evals/.env.local ./packages/evals/ # Copy the pre-installed VS Code extensions RUN cp -r /roo/.vscode-template /roo/.vscode # Build the Roo Code extension (for VSCode execution method) RUN pnpm vsix -- --out ../bin/roo-code.vsix \ && yes | code --no-sandbox --user-data-dir /roo/.vscode --install-extension bin/roo-code.vsix # Build the extension bundle and CLI (for CLI execution method) # The CLI requires the extension bundle (src/dist/extension.js) and the CLI build (apps/cli/dist/index.js) RUN pnpm --filter roo-cline bundle \ && pnpm --filter @roo-code/cli build # Copy entrypoint script COPY packages/evals/.docker/entrypoints/runner.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh ENV DATABASE_URL=postgresql://postgres:password@db:5432/evals_development ENV REDIS_URL=redis://redis:6379 ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]