Created
April 4, 2026 19:36
-
-
Save HauptJ/bffe29cbd53f4b53bffe282c6eb46ff1 to your computer and use it in GitHub Desktop.
Fixed ZeroClaw Debian Development Dockerfile
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # syntax=docker/dockerfile:1.7 | |
| # ── Stage 0: Frontend build ───────────────────────────────────── | |
| FROM node:22-alpine AS web-builder | |
| WORKDIR /web | |
| COPY web/package.json web/package-lock.json* ./ | |
| RUN npm ci --ignore-scripts 2>/dev/null || npm install --ignore-scripts | |
| COPY web/ . | |
| RUN npm run build | |
| # Dockerfile.debian — Shell-equipped variant of the ZeroClaw container. | |
| # | |
| # The default Dockerfile produces a distroless "release" image with no shell, | |
| # which is ideal for minimal attack surface but prevents the agent from using | |
| # shell-based tools (pwd, ls, git, curl, etc.). | |
| # | |
| # This variant uses debian:bookworm-slim as the runtime base and ships | |
| # essential CLI tools so the agent can operate as a full coding assistant. | |
| # | |
| # Build: | |
| # docker build -f Dockerfile.debian -t zeroclaw:debian . | |
| # | |
| # Or with docker compose: | |
| # docker compose -f docker-compose.yml -f docker-compose.debian.yml up | |
| # ── Stage 1: Build (match runtime glibc baseline) ─────────── | |
| FROM rust:1.94-bookworm AS builder | |
| WORKDIR /app | |
| ARG ZEROCLAW_CARGO_FEATURES="channel-lark,whatsapp-web" | |
| # Install build dependencies | |
| RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ | |
| --mount=type=cache,target=/var/lib/apt,sharing=locked \ | |
| apt-get update && apt-get install -y \ | |
| pkg-config \ | |
| && rm -rf /var/lib/apt/lists/* | |
| # 1. Copy manifests to cache dependencies | |
| COPY Cargo.toml Cargo.lock ./ | |
| # Include every workspace member: Cargo.lock is generated for the full workspace. | |
| # Previously we used sed to drop `crates/robot-kit`, which made the manifest disagree | |
| # with the lockfile and caused `cargo --locked` to fail (Cargo refused to rewrite the lock). | |
| COPY crates/robot-kit/ crates/robot-kit/ | |
| COPY crates/aardvark-sys/ crates/aardvark-sys/ | |
| # Include tauri workspace member manifest (desktop app, but needed for workspace resolution). | |
| # .dockerignore whitelists only Cargo.toml; src and build.rs are stubbed below. | |
| COPY apps/tauri/Cargo.toml apps/tauri/Cargo.toml | |
| # Create dummy targets declared in Cargo.toml so manifest parsing succeeds. | |
| RUN mkdir -p src benches apps/tauri/src \ | |
| && echo "fn main() {}" > src/main.rs \ | |
| && echo "" > src/lib.rs \ | |
| && echo "fn main() {}" > benches/agent_benchmarks.rs \ | |
| && echo "fn main() {}" > apps/tauri/src/main.rs \ | |
| && echo "fn main() {}" > apps/tauri/build.rs | |
| RUN --mount=type=cache,id=zeroclaw-cargo-registry,target=/usr/local/cargo/registry,sharing=locked \ | |
| --mount=type=cache,id=zeroclaw-cargo-git,target=/usr/local/cargo/git,sharing=locked \ | |
| --mount=type=cache,id=zeroclaw-target,target=/app/target,sharing=locked \ | |
| if [ -n "$ZEROCLAW_CARGO_FEATURES" ]; then \ | |
| cargo build --release --locked --features "$ZEROCLAW_CARGO_FEATURES"; \ | |
| else \ | |
| cargo build --release --locked; \ | |
| fi | |
| RUN rm -rf src benches | |
| # 2. Copy only build-relevant source paths (avoid cache-busting on docs/tests/scripts) | |
| COPY src/ src/ | |
| COPY benches/ benches/ | |
| COPY --from=web-builder /web/dist web/dist | |
| COPY *.rs . | |
| RUN touch src/main.rs | |
| RUN --mount=type=cache,id=zeroclaw-cargo-registry,target=/usr/local/cargo/registry,sharing=locked \ | |
| --mount=type=cache,id=zeroclaw-cargo-git,target=/usr/local/cargo/git,sharing=locked \ | |
| --mount=type=cache,id=zeroclaw-target,target=/app/target,sharing=locked \ | |
| rm -rf target/release/.fingerprint/zeroclawlabs-* \ | |
| target/release/deps/zeroclawlabs-* \ | |
| target/release/incremental/zeroclawlabs-* && \ | |
| if [ -n "$ZEROCLAW_CARGO_FEATURES" ]; then \ | |
| cargo build --release --locked --features "$ZEROCLAW_CARGO_FEATURES"; \ | |
| else \ | |
| cargo build --release --locked; \ | |
| fi && \ | |
| cp target/release/zeroclaw /app/zeroclaw && \ | |
| strip /app/zeroclaw | |
| RUN size=$(stat -c%s /app/zeroclaw) && \ | |
| if [ "$size" -lt 1000000 ]; then echo "ERROR: binary too small (${size} bytes), likely dummy build artifact" && exit 1; fi | |
| # Prepare runtime directory structure and default config inline (no extra stage) | |
| RUN mkdir -p /zeroclaw-data/.zeroclaw /zeroclaw-data/workspace && \ | |
| printf '%s\n' \ | |
| 'workspace_dir = "/zeroclaw-data/workspace"' \ | |
| 'config_path = "/zeroclaw-data/.zeroclaw/config.toml"' \ | |
| 'api_key = ""' \ | |
| 'default_provider = "openrouter"' \ | |
| 'default_model = "anthropic/claude-sonnet-4-20250514"' \ | |
| 'default_temperature = 0.7' \ | |
| '' \ | |
| '[gateway]' \ | |
| 'port = 42617' \ | |
| 'host = "[::]"' \ | |
| 'allow_public_bind = true' \ | |
| '' \ | |
| '[autonomy]' \ | |
| 'level = "supervised"' \ | |
| 'auto_approve = ["file_read", "file_write", "file_edit", "memory_recall", "memory_store", "web_search_tool", "web_fetch", "calculator", "glob_search", "content_search", "image_info", "weather", "git_operations"]' \ | |
| > /zeroclaw-data/.zeroclaw/config.toml && \ | |
| chown -R 65534:65534 /zeroclaw-data | |
| # ── Stage 2: Runtime (Debian with shell) ───────────────────── | |
| FROM debian:bookworm-slim AS runtime | |
| # Install essential tools for agent shell operations | |
| RUN apt-get update && apt-get install -y --no-install-recommends \ | |
| bash \ | |
| ca-certificates \ | |
| curl \ | |
| git \ | |
| && rm -rf /var/lib/apt/lists/* | |
| COPY --from=builder /app/zeroclaw /usr/local/bin/zeroclaw | |
| COPY --from=builder /zeroclaw-data /zeroclaw-data | |
| # Environment setup | |
| # Ensure UTF-8 locale so CJK / multibyte input is handled correctly | |
| ENV LANG=C.UTF-8 | |
| ENV ZEROCLAW_WORKSPACE=/zeroclaw-data/workspace | |
| ENV HOME=/zeroclaw-data | |
| # Default provider and model are set in config.toml, not here, | |
| # so config file edits are not silently overridden | |
| ENV ZEROCLAW_GATEWAY_PORT=42617 | |
| # API_KEY must be provided at runtime! | |
| WORKDIR /zeroclaw-data | |
| USER 65534:65534 | |
| EXPOSE 42617 | |
| HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=10s \ | |
| CMD ["zeroclaw", "status", "--format=exit-code"] | |
| ENTRYPOINT ["zeroclaw"] | |
| CMD ["daemon"] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment