# ============================================================================= # BASE: Common dependencies (cached across all workspace services) # ============================================================================= FROM lukemathwalker/cargo-chef:latest-rust-1.93-slim-bookworm AS base WORKDIR /app # Instala dependencias del sistema necesarias para compilar crates de C y linkeo rápido RUN apt-get update && apt-get install -y \ pkg-config libssl-dev build-essential ca-certificates lld \ && rm -rf /var/lib/apt/lists/* # Linker LLD para reducir el tiempo de linkeado significativamente ENV RUSTFLAGS="-C link-arg=-fuse-ld=lld" ENV CARGO_INCREMENTAL=0 # ============================================================================= # 1. PLANNER: Genera el archivo recipe.json para cachear dependencias # ============================================================================= FROM base AS planner # Copiamos solo los archivos que definen dependencias (workspace y miembros) COPY Cargo.toml Cargo.lock ./ COPY services/shared-lib/Cargo.toml services/shared-lib/Cargo.toml COPY services/backend-api/Cargo.toml services/backend-api/Cargo.toml COPY services/data-collector/Cargo.toml services/data-collector/Cargo.toml COPY services/json-generator/Cargo.toml services/json-generator/Cargo.toml COPY services/events-relay/Cargo.toml services/events-relay/Cargo.toml COPY services/build-orchestrator/Cargo.toml services/build-orchestrator/Cargo.toml COPY services/edge-agent/Cargo.toml services/edge-agent/Cargo.toml COPY services/telemetry-ingestor/Cargo.toml services/telemetry-ingestor/Cargo.toml # Creamos estructuras dummy para que cargo metadata no falle (muy importante para la caché) RUN mkdir -p services/shared-lib/src && touch services/shared-lib/src/lib.rs && \ mkdir -p services/backend-api/src && echo "fn main() {}" > services/backend-api/src/main.rs && \ mkdir -p services/data-collector/src && echo "fn main() {}" > services/data-collector/src/main.rs && \ mkdir -p services/json-generator/src && echo "fn main() {}" > services/json-generator/src/main.rs && \ mkdir -p services/events-relay/src && echo "fn main() {}" > services/events-relay/src/main.rs && \ mkdir -p services/build-orchestrator/src && echo "fn main() {}" > services/build-orchestrator/src/main.rs && \ mkdir -p services/edge-agent/src && echo "fn main() {}" > services/edge-agent/src/main.rs && \ mkdir -p services/telemetry-ingestor/src && echo "fn main() {}" > services/telemetry-ingestor/src/main.rs # Generamos la receta solo para este binario RUN cargo chef prepare --recipe-path recipe.json --bin data-collector # ============================================================================= # 2. CACHER: Descarga y compila las dependencias (etapa lenta) # ============================================================================= FROM base AS cacher COPY --from=planner /app/recipe.json recipe.json # Cook solo lo necesario para este binario para máxima velocidad RUN cargo chef cook --release --recipe-path recipe.json --bin data-collector # ============================================================================= # 3. BUILDER # ============================================================================= FROM base AS builder # Copiar el esqueleto dummy y las dependencias pre-compiladas desde el cacher COPY --from=cacher /app /app COPY --from=cacher /usr/local/cargo /usr/local/cargo # Copiar el código real de los crates que vamos a compilar (sobreescribiendo los stubs) COPY services/shared-lib services/shared-lib COPY services/data-collector services/data-collector RUN cargo build --release --bin data-collector # ============================================================================= # 4. RUNTIME # ============================================================================= FROM debian:bookworm-slim WORKDIR /app RUN apt-get update && apt-get install -y libssl3 ca-certificates && rm -rf /var/lib/apt/lists/* COPY --from=builder /app/target/release/data-collector . ENV RUST_LOG=info CMD ["./data-collector"]