From f9071d492cf8d44e0794c60b8d4965721e366128 Mon Sep 17 00:00:00 2001 From: Daniil Polyakov Date: Fri, 20 Mar 2026 18:39:58 +0300 Subject: [PATCH] feat: cache rust builds in docker to speed up subsequent builds --- .dockerignore | 15 ++++++++++++--- explorer_service/Dockerfile | 12 +++++++++--- indexer/service/Dockerfile | 21 ++++++++++++++------- sequencer/service/Dockerfile | 23 +++++++++++++++-------- 4 files changed, 50 insertions(+), 21 deletions(-) diff --git a/.dockerignore b/.dockerignore index 0fbe460c..11f1a350 100644 --- a/.dockerignore +++ b/.dockerignore @@ -26,11 +26,20 @@ Thumbs.db ci_scripts/ # Documentation +docs/ *.md !README.md -# Configs (copy selectively if needed) +# Non-build project files +completions/ configs/ - -# License +Justfile +clippy.toml +rustfmt.toml +flake.nix +flake.lock LICENSE + +# Docker compose files (not needed inside build) +docker-compose*.yml +**/docker-compose*.yml diff --git a/explorer_service/Dockerfile b/explorer_service/Dockerfile index 238e77e6..6484619f 100644 --- a/explorer_service/Dockerfile +++ b/explorer_service/Dockerfile @@ -22,7 +22,13 @@ WORKDIR /explorer_service COPY . . # Build the app -RUN cargo leptos build --release -vv +RUN --mount=type=cache,target=/usr/local/cargo/registry/index \ + --mount=type=cache,target=/usr/local/cargo/registry/cache \ + --mount=type=cache,target=/usr/local/cargo/git \ + --mount=type=cache,target=/explorer_service/target \ + cargo leptos build --release -vv \ + && cp /explorer_service/target/release/explorer_service /usr/local/bin/explorer_service \ + && cp -r /explorer_service/target/site /explorer_service/site_output FROM debian:trixie-slim AS runtime WORKDIR /explorer_service @@ -33,10 +39,10 @@ RUN apt-get update -y \ && rm -rf /var/lib/apt/lists/* # Copy the server binary to the /explorer_service directory -COPY --from=builder /explorer_service/target/release/explorer_service /explorer_service/ +COPY --from=builder /usr/local/bin/explorer_service /explorer_service/ # /target/site contains our JS/WASM/CSS, etc. -COPY --from=builder /explorer_service/target/site /explorer_service/site +COPY --from=builder /explorer_service/site_output /explorer_service/site # Copy Cargo.toml as it’s needed at runtime COPY --from=builder /explorer_service/Cargo.toml /explorer_service/ diff --git a/indexer/service/Dockerfile b/indexer/service/Dockerfile index 2b78103e..cc7087bb 100644 --- a/indexer/service/Dockerfile +++ b/indexer/service/Dockerfile @@ -51,16 +51,23 @@ RUN cargo chef prepare --bin indexer_service --recipe-path recipe.json FROM chef AS builder COPY --from=planner /indexer_service/recipe.json recipe.json # Build dependencies only (this layer will be cached) -RUN cargo chef cook --bin indexer_service --release --recipe-path recipe.json +RUN --mount=type=cache,target=/usr/local/cargo/registry/index \ + --mount=type=cache,target=/usr/local/cargo/registry/cache \ + --mount=type=cache,target=/usr/local/cargo/git \ + --mount=type=cache,target=/indexer_service/target \ + cargo chef cook --bin indexer_service --release --recipe-path recipe.json # Copy source code COPY . . -# Build the actual application -RUN cargo build --release --bin indexer_service - -# Strip debug symbols to reduce binary size -RUN strip /indexer_service/target/release/indexer_service +# Build the actual application and copy the binary out of the cache mount +RUN --mount=type=cache,target=/usr/local/cargo/registry/index \ + --mount=type=cache,target=/usr/local/cargo/registry/cache \ + --mount=type=cache,target=/usr/local/cargo/git \ + --mount=type=cache,target=/indexer_service/target \ + cargo build --release --bin indexer_service \ + && strip /indexer_service/target/release/indexer_service \ + && cp /indexer_service/target/release/indexer_service /usr/local/bin/indexer_service # Runtime stage - minimal image FROM debian:trixie-slim @@ -71,7 +78,7 @@ RUN useradd -m -u 1000 -s /bin/bash indexer_service_user && \ chown -R indexer_service_user:indexer_service_user /indexer_service /etc/indexer_service /var/lib/indexer_service # Copy binary from builder -COPY --from=builder --chown=indexer_service_user:indexer_service_user /indexer_service/target/release/indexer_service /usr/local/bin/indexer_service +COPY --from=builder --chown=indexer_service_user:indexer_service_user /usr/local/bin/indexer_service /usr/local/bin/indexer_service # Copy r0vm binary from builder COPY --from=builder --chown=indexer_service_user:indexer_service_user /usr/local/bin/r0vm /usr/local/bin/r0vm diff --git a/sequencer/service/Dockerfile b/sequencer/service/Dockerfile index 52c9bd9b..10641e9a 100644 --- a/sequencer/service/Dockerfile +++ b/sequencer/service/Dockerfile @@ -55,7 +55,11 @@ FROM chef AS builder ARG STANDALONE COPY --from=planner /sequencer_service/recipe.json recipe.json # Build dependencies only (this layer will be cached) -RUN if [ "$STANDALONE" = "true" ]; then \ +RUN --mount=type=cache,target=/usr/local/cargo/registry/index \ + --mount=type=cache,target=/usr/local/cargo/registry/cache \ + --mount=type=cache,target=/usr/local/cargo/git \ + --mount=type=cache,target=/sequencer_service/target \ + if [ "$STANDALONE" = "true" ]; then \ cargo chef cook --bin sequencer_service --features standalone --release --recipe-path recipe.json; \ else \ cargo chef cook --bin sequencer_service --release --recipe-path recipe.json; \ @@ -64,15 +68,18 @@ RUN if [ "$STANDALONE" = "true" ]; then \ # Copy source code COPY . . -# Build the actual application -RUN if [ "$STANDALONE" = "true" ]; then \ +# Build the actual application and copy the binary out of the cache mount +RUN --mount=type=cache,target=/usr/local/cargo/registry/index \ + --mount=type=cache,target=/usr/local/cargo/registry/cache \ + --mount=type=cache,target=/usr/local/cargo/git \ + --mount=type=cache,target=/sequencer_service/target \ + if [ "$STANDALONE" = "true" ]; then \ cargo build --release --features standalone --bin sequencer_service; \ else \ cargo build --release --bin sequencer_service; \ - fi - -# Strip debug symbols to reduce binary size -RUN strip /sequencer_service/target/release/sequencer_service + fi \ + && strip /sequencer_service/target/release/sequencer_service \ + && cp /sequencer_service/target/release/sequencer_service /usr/local/bin/sequencer_service # Runtime stage - minimal image FROM debian:trixie-slim @@ -83,7 +90,7 @@ RUN useradd -m -u 1000 -s /bin/bash sequencer_user && \ chown -R sequencer_user:sequencer_user /sequencer_service /etc/sequencer_service /var/lib/sequencer_service # Copy binary from builder -COPY --from=builder --chown=sequencer_user:sequencer_user /sequencer_service/target/release/sequencer_service /usr/local/bin/sequencer_service +COPY --from=builder --chown=sequencer_user:sequencer_user /usr/local/bin/sequencer_service /usr/local/bin/sequencer_service # Copy r0vm binary from builder COPY --from=builder --chown=sequencer_user:sequencer_user /usr/local/bin/r0vm /usr/local/bin/r0vm