Some checks failed
CI / Format (push) Successful in 4s
CI / Clippy (push) Failing after 40s
CI / Security Audit (push) Has been skipped
CI / Tests (push) Has been skipped
CI / Format (pull_request) Successful in 3s
CI / Clippy (pull_request) Failing after 4s
CI / Security Audit (pull_request) Has been skipped
CI / Tests (pull_request) Has been skipped
CI / Deploy (push) Has been skipped
CI / Deploy (pull_request) Has been skipped
- Add .cargo/config.toml with rustc-wrapper = sccache for local caching - Install sccache in CI clippy/test jobs via prebuilt musl binary - Add actions/cache to persist sccache dir across CI runs (keyed by Cargo.lock) - Add BuildKit cache mounts in Dockerfile for sccache across Docker builds - Disable sccache for fmt/audit jobs where it adds no value Local clean-rebuild speedup: 1m58s -> 34s (3.4x) with warm cache. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
70 lines
2.0 KiB
Docker
70 lines
2.0 KiB
Docker
# syntax=docker/dockerfile:1
|
|
# Stage 1: Generate dependency recipe for caching
|
|
FROM rust:1.89-bookworm AS chef
|
|
RUN cargo install cargo-chef
|
|
WORKDIR /app
|
|
|
|
FROM chef AS planner
|
|
COPY . .
|
|
RUN cargo chef prepare --recipe-path recipe.json
|
|
|
|
# Stage 2: Build dependencies + application
|
|
FROM chef AS builder
|
|
|
|
# Install system dependencies
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
pkg-config libssl-dev curl unzip \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Install sccache for compile caching across Docker builds
|
|
RUN curl -fsSL https://github.com/mozilla/sccache/releases/download/v0.9.1/sccache-v0.9.1-x86_64-unknown-linux-musl.tar.gz \
|
|
| tar xz --strip-components=1 -C /usr/local/bin/ sccache-v0.9.1-x86_64-unknown-linux-musl/sccache \
|
|
&& chmod +x /usr/local/bin/sccache
|
|
|
|
ENV RUSTC_WRAPPER=/usr/local/bin/sccache
|
|
ENV SCCACHE_DIR=/tmp/sccache
|
|
|
|
# Install bun (for Tailwind CSS build step)
|
|
RUN curl -fsSL https://bun.sh/install | bash
|
|
ENV PATH="/root/.bun/bin:$PATH"
|
|
|
|
# Install dx CLI from source (binstall binaries require GLIBC >= 2.38)
|
|
RUN --mount=type=cache,target=/tmp/sccache \
|
|
cargo install dioxus-cli@0.7.3 --locked
|
|
|
|
# Cook dependencies from recipe (cached layer)
|
|
COPY --from=planner /app/recipe.json recipe.json
|
|
RUN --mount=type=cache,target=/tmp/sccache \
|
|
cargo chef cook --release --recipe-path recipe.json
|
|
|
|
# Copy source and build
|
|
COPY . .
|
|
|
|
# Install frontend dependencies (DaisyUI, Tailwind) for the build.rs CSS step
|
|
RUN bun install --frozen-lockfile
|
|
|
|
# Bundle the fullstack application
|
|
RUN --mount=type=cache,target=/tmp/sccache \
|
|
dx bundle --release --fullstack
|
|
|
|
# Stage 3: Minimal runtime image
|
|
FROM debian:bookworm-slim AS runtime
|
|
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
ca-certificates libssl3 \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
RUN useradd --create-home --shell /bin/bash app
|
|
USER app
|
|
WORKDIR /home/app
|
|
|
|
# Copy the bundled output from builder
|
|
COPY --from=builder --chown=app:app /app/target/dx/dashboard/release/web/ ./
|
|
|
|
EXPOSE 8000
|
|
|
|
ENV IP=0.0.0.0
|
|
ENV PORT=8000
|
|
|
|
ENTRYPOINT ["./dashboard"]
|