FROM rust:1.87-slim AS builder WORKDIR /build RUN apt-get update && apt-get install -y pkg-config libssl-dev && rm -rf /var/lib/apt/lists/* # Copy workspace manifests COPY Cargo.toml Cargo.lock ./ # Copy only the crates needed for klog-backend COPY crates/ktracing/Cargo.toml crates/ktracing/Cargo.toml COPY crates/ktracing-subscriber/Cargo.toml crates/ktracing-subscriber/Cargo.toml COPY klog/backend/Cargo.toml klog/backend/Cargo.toml COPY klog/klog-cli/Cargo.toml klog/klog-cli/Cargo.toml COPY klog/types/Cargo.toml klog/types/Cargo.toml # Stub out every workspace member so Cargo can resolve the graph without full source RUN find . -name "Cargo.toml" -not -path "./Cargo.toml" | while read f; do \ dir=$(dirname "$f"); \ mkdir -p "$dir/src"; \ echo 'fn main() {}' > "$dir/src/main.rs"; \ touch "$dir/src/lib.rs"; \ done # Build deps only (cache layer) RUN cargo build --release -p klog-backend 2>/dev/null || true # Now copy real source COPY crates/ktracing/src crates/ktracing/src COPY crates/ktracing-subscriber/src crates/ktracing-subscriber/src COPY klog/backend/src klog/backend/src COPY klog/types/src klog/types/src # Touch to invalidate cached stubs RUN find klog/backend/src klog/types/src crates/ktracing/src crates/ktracing-subscriber/src \ -name "*.rs" -exec touch {} + RUN cargo build --release -p klog-backend # ── Runtime image ───────────────────────────────────────────────────────────── FROM debian:bookworm-slim RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/* COPY --from=builder /build/target/release/klog-backend /usr/local/bin/klog-backend ENV PORT=3000 EXPOSE 3000 CMD ["/usr/local/bin/klog-backend"]