FROM node:24.12.0-bookworm ARG TOOLKIT_BUILD_ID=dev # System deps RUN apt-get update && apt-get install -y \ git \ python3 \ python3-pip \ python3-venv \ sqlite3 \ curl \ zip \ unzip \ ca-certificates \ gnupg \ && rm -rf /var/lib/apt/lists/* # Install Docker CE CLI + compose plugin (not docker.io from apt which lacks compose) RUN install -m 0755 -d /etc/apt/keyrings \ && curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc \ && chmod a+r /etc/apt/keyrings/docker.asc \ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian bookworm stable" > /etc/apt/sources.list.d/docker.list \ && apt-get update \ && apt-get install -y docker-ce-cli docker-compose-plugin \ && rm -rf /var/lib/apt/lists/* # Pin npm so lockfiles do not churn between this container and any host # install. node:24.12.0-bookworm bundles an older npm; overwrite it. RUN npm install -g npm@11.12.1 # Install uv and harbor RUN pip3 install --break-system-packages uv && uv tool install harbor==0.20.0 # Pin harbor to the local docker backend — the only backend this container is # provisioned for (docker CLI + host docker socket, configured above). The # bundled scripts/harbor-run otherwise defaults to a cloud sandbox backend that # needs an API key this container doesn't ship, and exits 1 before running. # NOTE: devcontainer.json also sets HARBOR_ENV=docker via containerEnv — keep # BOTH. containerEnv survives a stale image (workers who upgrade the toolkit # files without rebuilding still get docker), while this ENV covers running the # image directly with `docker run` outside the devcontainer tooling. Removing # either as a "duplicate" reintroduces the daytona-default error. ENV HARBOR_ENV=docker # Make uv tools and Claude Code available ENV PATH="/root/.local/bin:${PATH}" WORKDIR /workspace