💭
RustのDocker Build時間短縮したい
概要
前回ざっくりBFF+gPRCのバックエンド構成をRustで作ってみた
けど、Rustって結構ビルドに時間かかるんやなぁ...と思いながらググってたら
素敵な記事がたくさんあった😭
とりあえず二つ目の記事の真似して
前回作ったDockerfileを修正して後で思い出せるようにメモ残しとく
Dockerfileの改善
修正前
FROM rust:1.55 as builder
WORKDIR /usr/src/myapp
COPY . .
RUN rustup component add rustfmt
RUN cargo install --path .
FROM debian:buster-slim
RUN apt-get update && rm -rf /var/lib/apt/lists/*
COPY /usr/local/cargo/bin/identity /usr/local/bin/identity
CMD ["identity"]
修正後
FROM rust:1.55.0 as builder
# ★1.a
RUN USER=root cargo new --bin app
WORKDIR /app
# Install dependencies first for cache ★1.b
COPY ./Cargo.lock ./Cargo.lock
COPY ./Cargo.toml ./Cargo.toml
RUN rustup component add rustfmt
RUN cargo build --release
RUN rm src/*.rs
# Build my app ★1.c
COPY ./proto ./proto
COPY ./build.rs ./build.rs
COPY ./src ./src
# ★2.b
RUN cargo install --locked --path .
# ★2.a
FROM debian:buster-slim
RUN apt-get update && rm -rf /var/lib/apt/lists/*
COPY /usr/local/cargo/bin/identity .
CMD ["./identity"]
修正ポイント
依存関係を先にbuild(★1)
dependenciesを先に取り込みキャッシュさせるために
cargo build --release
を一回先に実行しとく(★1.b)
そんでその後に、自身のソースコードのCOPYを書くことで(★1.c)
dependenciesに変更がなくて、ソース変更しただけの時にキャッシュ使わせて高速化させる
いきなりビルドするとmain.rsがない!とかってCargoに怒られるので
空のプロジェクトを最初に作っておく(★1.a)
容量削減のためにmulti-stage build(★2)
multi-stage build使ってbuilderステップでバイナリ生成
それをdebian:buster-slim
で実行(★2.a)
参考にした記事では
rust:1.49-slim-buster
をbase imageに使われてたが
より容量を小さくするためにdebian:buster-slim
を使用
そのため、
builder stepではcargo build --release
ではなくて
cargo install --locked --path .
を使用(★2.b)
(前者使うと、exec format error
て出てきちゃった
(速さの方を求めるならcargo buildの方が早いのかしら🧐
まとめ
ちゃんと測ってないけどとりあえず前回より早くなった
Rust未経験すぎるので、ちょっと学んだらちょっとずつメモ残していこう👨🏼🎤
Discussion