🐳
Dockerfileのalpineでの言語コンテナサイズ比較
背景
コンテナサイズ小さくして、起動早くしたいなっておもった。
せっかくなので各言語のalpineでのコンテナサイズを調べて比較してみた
前提
2023/06/25時点の最新のalpineのイメージで比較
baseline
- alpine:3.18.2
programming language images
- golang:1.20.5-alpine3.18
- rust:1.70-alpine3.18
- denoland/deno:alpine-1.34.3
- node:18.16.1-alpine3.18
- ruby:3.2.2-alpine
- python:3.11.4-alpine3.18
言語コンテナサイズ
$ docker images | grep alpine | sort -h -k 7
alpine 3.18.2 5053b247d78b 10 days ago 7.66MB
python 3.11.4-alpine3.18 b6f933e9636b 2 weeks ago 57.4MB
ruby 3.2.2-alpine ea28ac1562e0 10 days ago 80MB
denoland/deno alpine-1.34.3 b627addad4f5 9 days ago 126MB
node 18.16.1-alpine3.18 ab464216c5ef 3 days ago 173MB
golang 1.20.5-alpine3.18 19a250fba0a7 10 days ago 251MB
rust 1.70-alpine3.18 2bd90447a791 10 days ago 858MB
pythonが意外と小さくて驚いた..
golangとrustに関してはビルド後の最小バイナリサイズで比較してみたい感じする.
実行バイナリのコンテナサイズ (rust,golang)
Golangとrustに関しては、ビルドイメージと実行イメージを分けることが可能なので、
下記のようにDockerfileを定義して分けた.
Dockerfile.golang
FROM golang:1.20.5-alpine3.18
COPY main.go ./
RUN go build -o main main.go
FROM alpine:3.18.2
COPY /go/main ./
CMD ["./main"]
Dockerfile.rust
FROM rust:1.70-alpine3.18
COPY main.rs ./
RUN rustc -o main main.rs
FROM alpine:3.18.2
COPY /main ./
CMD ["./main"]
上記イメージをビルド
$ docker build -t alpine-rust-hello . -f Dockerfile.rust
$ docker build -t alpine-go-hello . -f Dockerfile.golang
イメージサイズの比較
$ docker images | grep alpine
alpine-rust-hello latest 0f2be3a2605a 4 minutes ago 12.4MB
alpine-go-hello latest 6dd5e296668b 7 minutes ago 9.57MB
ビルド後のバイナリ比較
$ docker run --rm -it alpine-go-hello /bin/sh
/ # ls -lha main
-rwxr-xr-x 1 root root 1.8M Jun 25 09:55 main
/ #
$ docker run --rm -it alpine-rust-hello /bin/sh
/ # ls -lha main
-rwxr-xr-x 1 root root 4.5M Jun 25 09:59 main
/ #
実行速度 (mac M1経由のlocal docker)
- hello,worldではほぼ変わらず... 0.09~0.10secだった.
感想
言語イメージでpythonが小さいのはちょっと意外
CloudRunなんかで起動イメージが小さいほどColdStartしたときの遅延も少なそうなので、マルチステージビルドした際にはちゃんと実行イメージが言語イメージ参照して大きくなってないか注意せねば..
(急いでるとミスってビルドイメージ使いがち...)
Discussion