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"]