Files
asepharyana-hub/infra/docker/tools.Dockerfile
T

93 lines
3.1 KiB
Docker
Raw Normal View History

# ============================================================
# Stage 1: Build Rust Backend (with cargo-chef caching)
# ============================================================
FROM lukemathwalker/cargo-chef:latest-rust-1.89.0 AS chef
RUN apt-get update && apt-get install -y --no-install-recommends \
libleptonica-dev libtesseract-dev clang pkg-config \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
FROM chef AS planner
COPY apps/tools/backend/ .
RUN cargo chef prepare --recipe-path recipe.json
FROM chef AS builder
RUN apt-get update && apt-get install -y --no-install-recommends \
libleptonica-dev libtesseract-dev clang pkg-config \
&& rm -rf /var/lib/apt/lists/*
COPY --from=planner /app/recipe.json recipe.json
RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/app/target \
cargo chef cook --release --recipe-path recipe.json
COPY apps/tools/backend/ .
RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/app/target \
cargo build --release --features tesseract --bin tools-gateway --bin tools-workers && \
cp /app/target/release/tools-gateway /app/tools-gateway-bin && \
cp /app/target/release/tools-workers /app/tools-workers-bin
# ============================================================
# Stage 2: Build Next.js Frontend
# ============================================================
FROM oven/bun:1.3 AS frontend-builder
WORKDIR /app
# Copy package files first for layer caching
COPY apps/tools/frontend/package.json apps/tools/frontend/bun.lock ./
RUN bun install --frozen-lockfile
COPY apps/tools/frontend/ .
RUN bun run build
# ============================================================
# Stage 3: Production Runtime
# ============================================================
FROM debian:bookworm-slim AS runtime
# Install runtime dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
tesseract-ocr \
tesseract-ocr-eng \
tesseract-ocr-ind \
tesseract-ocr-osd \
ca-certificates \
fonts-dejavu-core \
wget \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Copy Rust binaries (cp'd from cache mount in builder stage)
COPY --from=builder /app/tools-gateway-bin /app/gateway
COPY --from=builder /app/tools-workers-bin /app/workers
# Copy bun binary from frontend builder (needed to run Next.js server)
COPY --from=frontend-builder /usr/local/bin/bun /usr/local/bin/bun
# Copy Next.js build
COPY --from=frontend-builder /app/.next /app/.next
COPY --from=frontend-builder /app/public /app/public
COPY --from=frontend-builder /app/package.json /app/package.json
COPY --from=frontend-builder /app/node_modules /app/node_modules
COPY --from=frontend-builder /app/next.config.ts /app/next.config.ts
# Create temp storage directory
RUN mkdir -p /data/tools && chmod 1777 /data/tools
# Copy entrypoint
COPY apps/tools/scripts/entrypoint.sh /app/entrypoint.sh
RUN chmod +x /app/entrypoint.sh
# Environment
ENV TESSDATA_PREFIX=/usr/share/tesseract-ocr/5/tessdata
ENV STORAGE_PATH=/data/tools
ENV GATEWAY_PORT=3001
ENV TOOLS_WORKER_CONCURRENCY=4
ENV RUST_LOG=info
# Expose port
EXPOSE 3001
CMD ["/app/entrypoint.sh"]