💭

RustのDocker Build時間短縮したい

2021/09/19に公開

概要

前回ざっくりBFF+gPRCのバックエンド構成をRustで作ってみた
https://zenn.dev/ucwork/articles/10cb5778b92a3e

けど、Rustって結構ビルドに時間かかるんやなぁ...と思いながらググってたら
素敵な記事がたくさんあった😭
https://qiita.com/nabezokodaikon/items/b5878c1493a75a03e027
https://dev.to/rogertorres/first-steps-with-docker-rust-30oi

とりあえず二つ目の記事の真似して
前回作った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 --from=builder /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 --from=builder /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