DEV Community

Discussion on: Speedup Docker Build

Collapse
 
5422m4n profile image
Sven Kanoldt

Yeah that is very crutial. There is yet another trick when building rust docker images, to keep the build time low, and take full advantage of the docker build cache. That is build a project from scratch, copy only over you Cargo.{lock,toml}, run a build.
That trick will cause a pull and build of all dependencies, so that docker can cache that, and next time when you have changes only on your code, it will skip those steps because at this time you've only copied over the Cargo files and no code at all. See a rough draft below:

FROM rust:latest as builder

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        musl-tools

RUN rustup target add x86_64-unknown-linux-musl
RUN rustup component add clippy

FROM builder as server_builder

WORKDIR /graphql

## doing some overhead here to keep docker build time low
# create a new empty shell project
RUN USER=root cargo new --bin server
WORKDIR /graphql/server

# copy over your manifests
COPY ./server/Cargo.lock ./
COPY ./server/Cargo.toml ./

# this build step will cache dependencies
RUN RUSTFLAGS=-Clinker=musl-gcc cargo build --target x86_64-unknown-linux-musl --release
RUN rm src/*.rs
## done with the overhead

# skip all other waste and copy the code now
COPY ./server/src ./src
RUN rm -f ./target/release/deps/server*
RUN RUSTFLAGS=-Clinker=musl-gcc \
    cargo clippy --target x86_64-unknown-linux-musl --all-features -- -D warnings && \
    cargo test --target x86_64-unknown-linux-musl --verbose && \
    cargo build --target x86_64-unknown-linux-musl --release --verbose

# further things to be done..