# Multi-stage Dockerfile for the IronClaw agent (cloud deployment). # # Uses cargo-chef for dependency caching — only rebuilds deps when # Cargo.toml/Cargo.lock change, not on every source edit. # # Build: # docker build --platform linux/amd64 -t ironclaw:latest . # # Run: # docker run --env-file .env -p 3000:3000 ironclaw:latest # Stage 1: Install cargo-chef FROM rust:1.92-slim-bookworm AS chef RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config libssl-dev cmake gcc g++ \ && rm -rf /var/lib/apt/lists/* \ && rustup target add wasm32-wasip2 \ && cargo install cargo-chef wasm-tools WORKDIR /app # Stage 2: Generate the dependency recipe (changes only when Cargo.toml/lock change) FROM chef AS planner COPY Cargo.toml Cargo.lock ./ COPY crates/ crates/ COPY build.rs build.rs COPY src/ src/ COPY tests/ tests/ COPY benches/ benches/ COPY migrations/ migrations/ COPY registry/ registry/ COPY channels-src/ channels-src/ COPY wit/ wit/ COPY providers.json providers.json RUN cargo chef prepare --recipe-path recipe.json # Stage 3: Build dependencies (cached unless Cargo.toml/lock change) FROM chef AS deps COPY --from=planner /app/recipe.json recipe.json RUN cargo chef cook --release --recipe-path recipe.json # Stage 4: Build the actual binary (only recompiles ironclaw source) FROM deps AS builder COPY Cargo.toml Cargo.lock ./ COPY crates/ crates/ COPY build.rs build.rs COPY src/ src/ COPY tests/ tests/ COPY benches/ benches/ COPY migrations/ migrations/ COPY registry/ registry/ COPY channels-src/ channels-src/ COPY wit/ wit/ COPY providers.json providers.json RUN cargo build --release --bin ironclaw # Stage 5: Runtime FROM debian:bookworm-slim RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates libssl3 \ && update-ca-certificates \ && rm -rf /var/lib/apt/lists/* COPY --from=builder /app/target/release/ironclaw /usr/local/bin/ironclaw COPY --from=builder /app/migrations /app/migrations # Non-root user RUN useradd -m -u 1000 -s /bin/bash ironclaw USER ironclaw EXPOSE 3000 ENV RUST_LOG=ironclaw=info ENTRYPOINT ["ironclaw"]