# syntax=docker/dockerfile:1 FROM rust:alpine AS builder WORKDIR /app # Ставим нужные зависимости для компиляции C++ (нужно для tokenizers) RUN apk add --no-cache musl-dev g++ make # Сначала копируем ТОЛЬКО файлы манифестов COPY Cargo.toml Cargo.lock ./ # Создаем фейковый main.rs и компилируем ЗАВИСИМОСТИ. # Кэшируем скачанные крейты и скомпилированные объектные файлы! RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/app/target \ mkdir src && echo "fn main() {}" > src/main.rs && \ cargo build --release && \ rm -R src # Теперь копируем реальный код COPY . . # Компилируем ТВОЙ код. # Докер снова подтянет папку target из кэша. Зависимости собираться НЕ БУДУТ. RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/app/target \ cargo build --release && \ cp target/release/proxy-ws /tmp/proxy-ws # Финальный легкий образ FROM alpine:latest WORKDIR /app RUN apk add --no-cache ca-certificates # Копируем готовый бинарник и модели COPY --from=builder /tmp/proxy-ws ./proxy-ws COPY ./models ./models EXPOSE 3001 CMD ["./proxy-ws"]