🐳

Dockerfileのalpineでの言語コンテナサイズ比較

2023/06/25に公開

背景

コンテナサイズ小さくして、起動早くしたいなっておもった。
せっかくなので各言語の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 --from=0 /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 --from=0 /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