Files
OmniOilPersonal/services/data-collector/Dockerfile

72 lines
4.0 KiB
Docker

# =============================================================================
# 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"]