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