32 lines
1.1 KiB
Docker
32 lines
1.1 KiB
Docker
# 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"] |