# =============================================================================
# AI Model Vault — Multi-stage Dockerfile
# Produces a minimal, statically-linked binary for production use.
#
# Build targets:
# docker build -t aim:latest . # default (alpine)
# docker build --build-arg FEATURES=api -t aim:api . # with REST API
# docker build --target debian -t aim:debian . # Debian slim variant
# =============================================================================
# ---------------------------------------------------------------------------
# Stage 1 — Builder (uses Rust slim to compile the binary)
# ---------------------------------------------------------------------------
FROM rust:1.89-slim-bookworm AS builder
ARG FEATURES=""
RUN apt-get update && apt-get install -y --no-install-recommends \
pkg-config libssl-dev musl-tools && \
rm -rf /var/lib/apt/lists/*
RUN rustup target add x86_64-unknown-linux-musl
WORKDIR /build
COPY Cargo.toml Cargo.lock* ./
COPY src/ src/
COPY benches/ benches/
COPY examples/ examples/
COPY tests/ tests/
# Build the release binary (statically linked via musl)
RUN if [ -z "$FEATURES" ]; then \
cargo build --release --target x86_64-unknown-linux-musl; \
else \
cargo build --release --target x86_64-unknown-linux-musl --features "$FEATURES"; \
fi
# ---------------------------------------------------------------------------
# Stage 2a — Alpine runtime (default, ~12 MB image)
# ---------------------------------------------------------------------------
FROM alpine:3.20 AS alpine
RUN apk add --no-cache ca-certificates tini && \
addgroup -g 1000 aim && \
adduser -u 1000 -G aim -s /sbin/nologin -D aim
COPY --from=builder /build/target/x86_64-unknown-linux-musl/release/aim /usr/local/bin/aim
RUN chmod +x /usr/local/bin/aim
# XDG base directories
ENV XDG_DATA_HOME=/data \
XDG_CONFIG_HOME=/config \
XDG_CACHE_HOME=/cache
RUN mkdir -p /data /config /cache && chown -R aim:aim /data /config /cache
USER aim
WORKDIR /data
ENTRYPOINT ["tini", "--"]
CMD ["aim"]
EXPOSE 8080
VOLUME ["/data", "/config", "/cache"]
LABEL org.opencontainers.image.title="AI Model Vault" \
org.opencontainers.image.description="Universal secure vault for AI model formats" \
org.opencontainers.image.version="3.0.0" \
org.opencontainers.image.source="https://github.com/nervosys/AIModelVault" \
org.opencontainers.image.licenses="AGPL-3.0-or-later"
# ---------------------------------------------------------------------------
# Stage 2b — Debian runtime (for environments requiring glibc)
# ---------------------------------------------------------------------------
FROM debian:bookworm-slim AS debian
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates tini && \
rm -rf /var/lib/apt/lists/* && \
groupadd -g 1000 aim && \
useradd -u 1000 -g aim -s /usr/sbin/nologin -m aim
# For the Debian variant we rebuild with the default glibc target
COPY --from=builder /build/target/x86_64-unknown-linux-musl/release/aim /usr/local/bin/aim
RUN chmod +x /usr/local/bin/aim
ENV XDG_DATA_HOME=/data \
XDG_CONFIG_HOME=/config \
XDG_CACHE_HOME=/cache
RUN mkdir -p /data /config /cache && chown -R aim:aim /data /config /cache
USER aim
WORKDIR /data
ENTRYPOINT ["tini", "--"]
CMD ["aim"]
EXPOSE 8080
VOLUME ["/data", "/config", "/cache"]
LABEL org.opencontainers.image.title="AI Model Vault" \
org.opencontainers.image.description="Universal secure vault for AI model formats" \
org.opencontainers.image.version="3.0.0" \
org.opencontainers.image.source="https://github.com/nervosys/AIModelVault" \
org.opencontainers.image.licenses="AGPL-3.0-or-later"