# syntax=docker/dockerfile:1
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# fast-test-server - Ultra-fast MCP server in Rust for performance testing
# Multi-stage build for minimal image size (~15MB)
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

# =============================================================================
# Build stage - Rust compilation
# =============================================================================
FROM docker.io/rustlang/rust:nightly-slim AS builder

WORKDIR /app

# Install build dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
    pkg-config \
    && rm -rf /var/lib/apt/lists/*

# Copy manifests first for dependency caching
COPY Cargo.toml Cargo.lock* ./

# Create dummy src to cache dependencies (Docker layer caching optimization)
RUN mkdir src && echo "fn main() {}" > src/main.rs
RUN cargo build --release && rm -rf src target/release/deps/fast_test_server* target/release/.fingerprint/fast-test-server*

# Copy actual source
COPY src ./src

# Build release binary (touch to ensure mtime is newer than cached artifacts)
RUN touch src/main.rs && cargo build --release

# =============================================================================
# Runtime stage - Minimal distroless-like image
# =============================================================================
FROM docker.io/library/debian:trixie-slim

# Install runtime deps (ca-certificates + curl for health checks) and create
# the non-root mcpuser in a single layer.
RUN apt-get update && apt-get install -y --no-install-recommends \
        ca-certificates \
        curl \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean \
    && useradd -r -s /bin/false mcpuser

WORKDIR /app

# Copy binary from builder
COPY --from=builder /app/target/release/fast-test-server /app/fast-test-server

USER mcpuser

# Expose default port
EXPOSE 9080

# Environment configuration
ENV BIND_ADDRESS=0.0.0.0:9080
ENV RUST_LOG=info

# Labels for container registry
LABEL org.opencontainers.image.title="fast-test-server"
LABEL org.opencontainers.image.description="Ultra-fast MCP server in Rust for performance testing"
LABEL org.opencontainers.image.source="https://github.com/IBM/mcp-context-forge"
LABEL org.opencontainers.image.vendor="IBM"
LABEL org.opencontainers.image.licenses="Apache-2.0"

# Health check using curl (more reliable than wget in slim images)
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
    CMD curl -sf http://localhost:9080/health || exit 1

ENTRYPOINT ["/app/fast-test-server"]
