# Stage 1: Базовый образ с cargo-chef FROM lukemathwalker/cargo-chef:latest-rust-alpine AS chef WORKDIR /app # musl-dev нужен для компиляции под Alpine RUN apk add --no-cache musl-dev # Stage 2: Анализ зависимостей (создает "рецепт") FROM chef AS planner COPY . . RUN cargo chef prepare --recipe-path recipe.json # Stage 3: Сборка FROM chef AS builder COPY --from=planner /app/recipe.json recipe.json # КЭШИРУЕМЫЙ ШАГ: собираются только зависимости из Cargo.toml # Если ты поменяешь код в main.rs, Docker пропустит этот долгий шаг! RUN cargo chef cook --release --recipe-path recipe.json # Собираем сам код приложения COPY . . RUN cargo build --release # Stage 4: Финальный минималистичный рантайм FROM alpine:latest WORKDIR /app # Копируем только сжатый бинарник COPY --from=builder /app/target/release/proxy-ws ./proxy-ws EXPOSE 3001 CMD ["./proxy-ws"]