blog.bouzuya.net

2024-04-30 cargo-chef をためした

LukeMathWalker/cargo-chef を試してみた。まだ cargo workspace での動作を試していないけど現状は意図どおりにキャッシュできていそう。以下はぼくの理解。

cargo chef prepare で依存関係の情報 (recipe) を JSON に保存する。

cargo chef cook で (recipe) JSON から最小限のプロジェクトをつくりビルドして依存関係をコンパイル済みにする。

あとは COPY . . して target をコピーしてビルドすればキャッシュが良い感じに効く。

FROM rust:1.77-alpine AS chef
RUN apk update && apk add --no-cache musl-dev
WORKDIR /app
RUN cargo install cargo-chef --locked

FROM chef AS planner
COPY . .
RUN cargo chef prepare --recipe-path recipe.json

FROM chef AS cacher
COPY --from=planner /app/recipe.json recipe.json
RUN cargo chef cook --recipe-path recipe.json --release --target=x86_64-unknown-linux-musl

FROM chef AS builder
COPY . .
COPY --from=cacher /app/target target
RUN cargo build --release --target=x86_64-unknown-linux-musl

FROM scratch
LABEL org.opencontainers.image.source https://github.com/bouzuya/genuuid
ENV PORT=8080
COPY --from=builder /app/target/x86_64-unknown-linux-musl/release/genuuid /usr/local/bin/genuuid
ENTRYPOINT ["genuuid"]

chef は初回のみ。 planner はプロジェクトのうち recipe.json に影響する依存関係などに変更があるときだけ。 cacherrecipe.json に変更があるときだけ。 builder はプロジェクトに変更があると毎回だが、キャッシュが効いていれば時間はほとんどかからない。……はず。

cargo workspace でもうまく動くなら良さそう。 workspace だと特に面倒くさかったので。


今日のコミット。