kumpei.ikuta.me

いろいろな言語で Docker のマルチステージビルド

Docker におけるマルチステージビルド、だいたい Go でやってる人しかいないけど、まあ他の環境でもやりたいよね、というメモ。

FROM scratch で動かしていて極限までイメージサイズを削りたい、という場合はビルドして出てきたバイナリを strip するとかなり減らせる。デバッグできなくなるので省略。

C++ / GCC

-static で静的リンクしてコピーするだけ。依存ライブラリがある場合は、それらも静的リンクする必要がある。GCC イメージには GNU Make も入ってるので、プロジェクトによっては make してもいい。

FROM gcc:10.2.0 AS build
WORKDIR /workdir
COPY ./cpp-msb-static.cpp cpp-msb-static.cpp
RUN g++ cpp-msb-static.cpp -static -o cpp-msb-static

FROM scratch
WORKDIR /workdir
COPY --from=build /workdir/cpp-msb-static /workdir/cpp-msb-static
CMD ["./cpp-msb-static"]

動的リンクしたい場合は Alpine の APK でライブラリを入れて、パスを通す。ライブラリのソースを引っぱってきてビルドするステージを足せば FROM scratch でもできるんだろうけど、さすがに面倒…。いつかやりたい。

FROM gcc:10.2.0 AS build
WORKDIR /workdir
COPY ./cpp-msb-dynamic.cpp cpp-msb-dynamic.cpp
RUN g++ cpp-msb-dynamic.cpp -o cpp-msb-dynamic

FROM alpine:latest
RUN apk update && apk add --no-cache libstdc++ libc6-compat
ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/lib64
WORKDIR /workdir
COPY --from=build /workdir/cpp-msb-dynamic /workdir/cpp-msb-dynamic
CMD ["./cpp-msb-dynamic"]

D

あとで書く

Rust

ビルドターゲット x86_64-unknown-linux-musl を追加してビルドするだけ。簡単。

FROM rust:latest AS build
WORKDIR /workdir
RUN rustup target add x86_64-unknown-linux-musl
COPY ./Cargo.toml ./Cargo.lock ./
COPY ./src/ ./src
RUN cargo build --release --target=x86_64-unknown-linux-musl

FROM scratch
COPY --from=build /workdir/target/x86_64-unknown-linux-musl/release/rust-msb-static .
CMD ["./rust-msb-static"]

動的リンクする場合はこう。必要なライブラリ以外は C++ とほぼ同じ。

FROM rust:latest AS build
WORKDIR /workdir
COPY ./Cargo.toml ./Cargo.lock ./
COPY ./src/ ./src
RUN cargo build --release

FROM alpine:latest
WORKDIR /workdir
RUN apk update && apk add --no-cache libgcc libc6-compat
ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/lib64
COPY --from=build /workdir/target/release/rust-msb-dynamic .
CMD ["./rust-msb-dynamic"]

back to index