# Multi-Stage Dockerfile for {{project_name}}
#
# Auto-generated by `metabots init`
# Customize as needed, or regenerate with `metabots docker generate`
#
# Supports isomorphic deployment (robot, remote, dev targets)
# Build args control which nodes are included
#
# Uses cargo-chef for dependency caching (faster rebuilds)
# See docs/guides/FASTER_BUILDS.md
# syntax=docker/dockerfile:1
# ============================================================================
# Chef: Install cargo-chef for dependency caching
# ============================================================================
FROM rust:1.75-bookworm AS chef
RUN cargo install cargo-chef
WORKDIR /workspace
# ============================================================================
# Planner: Generate dependency recipe
# ============================================================================
FROM chef AS planner
# Copy monorepo structure (if in monorepo)
{{#if is_monorepo}}
COPY Cargo.toml Cargo.lock ./
COPY packages/ packages/
{{/if}}
# Copy project files
COPY {{project_path}}/Cargo.toml {{project_path}}/
COPY {{project_path}}/src/ {{project_path}}/src/
COPY {{project_path}}/build.rs {{project_path}}/
RUN cargo chef prepare --recipe-path recipe.json
# ============================================================================
# Base: Common dependencies (cached layer)
# ============================================================================
FROM chef AS base
# Copy recipe and build dependencies only (this layer is cached)
COPY --from=planner /workspace/recipe.json recipe.json
# Accept run target as build arg (robot, remote, or dev)
ARG RUN_TARGET=dev
# Build dependencies - this is cached unless Cargo.toml/lock changes
RUN --mount=type=cache,target=/usr/local/cargo/registry \
cargo chef cook --release --recipe-path recipe.json
# ============================================================================
# Development: Includes build tools for hot reload
# ============================================================================
FROM base AS development
# Install development tools
RUN cargo install cargo-watch
# Copy project manifests
COPY {{project_path}}/Cargo.toml {{project_path}}/
COPY {{project_path}}/build.rs {{project_path}}/
COPY {{project_path}}/metabots.json {{project_path}}/
# Create dummy source to satisfy cargo
# (Real source will be mounted as volumes)
RUN mkdir -p {{project_path}}/src && \
echo "fn main() {}" > {{project_path}}/src/main.rs
# Pre-build dependencies for faster hot reload
WORKDIR /workspace/{{project_path}}
RUN cargo build 2>/dev/null || true
# Development entrypoint
CMD ["cargo", "run", "--", "run"]
# ============================================================================
# Builder: Compile production binary with run target selection
# ============================================================================
FROM base AS builder
# Accept run target as build arg (robot, remote, or dev)
ARG RUN_TARGET=dev
# Copy monorepo structure (if in monorepo)
{{#if is_monorepo}}
COPY Cargo.toml Cargo.lock ./
COPY packages/ packages/
{{/if}}
# Copy entire project for build
COPY {{project_path}}/ {{project_path}}/
# Build release binary with target-specific features
WORKDIR /workspace/{{project_path}}
RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/workspace/target \
echo "Building for run target: ${RUN_TARGET}" && \
cargo build --release --no-default-features --features "target-${RUN_TARGET}" && \
cp /workspace/target/release/{{binary_name}} /workspace/{{binary_name}}
# ============================================================================
# Production: Robot target (minimal, hardware access)
# ============================================================================
FROM debian:bookworm-slim AS production-robot
# Install minimal runtime dependencies
RUN apt-get update && \
apt-get install -y ca-certificates && \
rm -rf /var/lib/apt/lists/*
# Copy ONLY the binary
COPY --from=builder /workspace/{{binary_name}} /usr/local/bin/{{binary_name}}
# Create cache directory for cloud-synced updates
RUN mkdir -p /var/cache/metabots/{models,configs}
# Production entrypoint
CMD ["{{binary_name}}", "run"]
# Health check
HEALTHCHECK --interval=30s --timeout=10s --retries=3 --start-period=10s \
CMD {{binary_name}} list || exit 1
# ============================================================================
# Production: Remote target (ML dependencies + optional GPU)
# ============================================================================
FROM debian:bookworm-slim AS production-remote
# Accept GPU configuration as build args
ARG ENABLE_GPU=false
ARG GPU_VENDOR=nvidia
# Install base runtime dependencies
RUN apt-get update && \
apt-get install -y \
ca-certificates \
libgomp1 \
wget \
&& rm -rf /var/lib/apt/lists/*
# Install GPU-specific dependencies if enabled
RUN if [ "$ENABLE_GPU" = "true" ]; then \
echo "Installing GPU support for: $GPU_VENDOR"; \
if [ "$GPU_VENDOR" = "nvidia" ]; then \
apt-get update && \
apt-get install -y --no-install-recommends \
cuda-cudart-12-0 \
libcublas-12-0 \
libcudnn8 \
&& rm -rf /var/lib/apt/lists/*; \
elif [ "$GPU_VENDOR" = "amd" ]; then \
apt-get update && \
apt-get install -y rocm-runtime && \
rm -rf /var/lib/apt/lists/*; \
fi; \
fi
# Copy ONLY the binary
COPY --from=builder /workspace/{{binary_name}} /usr/local/bin/{{binary_name}}
# Create directories for models, data, and logs
RUN mkdir -p \
/var/cache/metabots/models \
/var/cache/metabots/data \
/var/log/{{project_name}}
# Set environment variables
ENV CUDA_VISIBLE_DEVICES=${CUDA_VISIBLE_DEVICES:-0} \
MODEL_CACHE_PATH=/var/cache/metabots/models \
DATA_PATH=/var/cache/metabots/data
# Production entrypoint
CMD ["{{binary_name}}", "run"]
# Health check
HEALTHCHECK --interval=30s --timeout=10s --retries=3 --start-period=10s \
CMD {{binary_name}} list || exit 1
# ============================================================================
# Production: Dev target (all nodes for testing)
# ============================================================================
FROM debian:bookworm-slim AS production-dev
# Install runtime dependencies
RUN apt-get update && \
apt-get install -y ca-certificates libgomp1 && \
rm -rf /var/lib/apt/lists/*
# Copy ONLY the binary
COPY --from=builder /workspace/{{binary_name}} /usr/local/bin/{{binary_name}}
# Create cache directory
RUN mkdir -p /var/cache/metabots/{models,configs}
# Production entrypoint
CMD ["{{binary_name}}", "run"]
# Health check
HEALTHCHECK --interval=30s --timeout=10s --retries=3 --start-period=10s \
CMD {{binary_name}} list || exit 1