# Base stage with consistent working directory FROM docker.io/rust:1.89-slim AS base WORKDIR /app # Planner: produce recipe.json FROM base AS planner RUN apt-get update && apt-get install -y --no-install-recommends pkg-config libssl-dev ca-certificates && rm -rf /var/lib/apt/lists/* RUN cargo install --locked cargo-chef COPY . . RUN cargo chef prepare --recipe-path recipe.json # Deps: compile only external crates FROM base AS deps RUN apt-get update && apt-get install -y --no-install-recommends pkg-config libssl-dev ca-certificates && rm -rf /var/lib/apt/lists/* RUN cargo install --locked cargo-chef ENV CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse COPY --from=planner /app/recipe.json recipe.json RUN cargo chef cook --release --recipe-path recipe.json # Test-build: compile workspace with pre-built dependencies FROM base AS test-build COPY --from=deps /usr/local/cargo /usr/local/cargo COPY --from=deps /usr/local/rustup /usr/local/rustup COPY --from=deps /app/target /app/target COPY . . RUN cargo test --workspace --locked --no-run # Runner: minimal runtime for test execution FROM base AS runner COPY --from=test-build /app/target /app/target WORKDIR /app CMD ["cargo", "test", "--workspace", "--locked", "--", "--test-threads=1"]