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
に影響する依存関係などに変更があるときだけ。 cacher
は recipe.json
に変更があるときだけ。 builder
はプロジェクトに変更があると毎回だが、キャッシュが効いていれば時間はほとんどかからない。……はず。
cargo workspace でもうまく動くなら良さそう。 workspace だと特に面倒くさかったので。
今日のコミット。
- genuuid 1 commit