イメージを軽量化する - image size
軽量ベースイメージの選定、不要ファイルの削除、マルチステージの活用でイメージサイズを抑える。
概念図
構文
bash
# 軽量ベース
FROM alpine:3.20
FROM gcr.io/distroless/static-debian12
FROM scratch
# レイヤー分析
dive <image>
docker history <image>実例
distroless に静的バイナリを載せて非 root で実行
bash
FROM gcr.io/distroless/static-debian12
COPY --from=builder /out/app /app
USER 65532:65532
ENTRYPOINT ["/app"]alpine + `--no-cache` で APK インデックスを残さない
bash
FROM alpine:3.20
RUN apk add --no-cache ca-certificates tzdata
COPY --from=builder /out/app /usr/local/bin/app
CMD ["app"]dive でレイヤーごとのサイズと無駄ファイルを可視化
bash
dive myapp:latestベースイメージの選び方
ベースイメージの選定はサイズと運用性のトレードオフ。
要件は「何を実行するか」「デバッグが必要か」「サイズ上限」で決める。
| ベース | サイズ目安 | 特徴 | 向いている用途 |
|---|---|---|---|
ubuntu / debian |
100 MB 以上 | ツールが揃っていてデバッグしやすい | 開発・検証用、ツールが多く必要な本番 |
*-slim |
70 MB 前後 | 不要パッケージを削ったバリアント | 多くのアプリで十分な標準選択肢 |
alpine |
5〜10 MB | musl libc ベース。小さいが glibc 前提のバイナリや一部ライブラリで非互換が出る | サイズ優先、musl でも動く言語・ツール |
distroless |
2 MB 前後 | ランタイムだけ。シェルも入っていない | 本番の静的バイナリや最小構成のサービス |
scratch |
0 MB | 完全な空 | 完全な静的バイナリ(Go など) |
bash
# 目安の比較
# debian:bookworm ~ 120 MB
# debian:bookworm-slim ~ 75 MB
# ubuntu:24.04 ~ 78 MB
# alpine:3.20 ~ 7 MB
# distroless/static ~ 2 MB
# scratch ~ 0 MBalpine と distroless の違い
両者はいずれも軽量ベースだが、性格がかなり異なる。
| 観点 | alpine |
distroless |
|---|---|---|
| ベース | BusyBox ベースの小さな Linux ディストリビューション | Google 公開のランタイム専用イメージ |
| シェル | sh 入り |
非搭載(:debug タグなら入り) |
| パッケージマネージャ | apk で追加可能 |
非搭載 |
| libc | musl libc(glibc 前提のバイナリや一部 Python wheel は再コンパイル必要) | glibc(distroless/base 系) |
| 攻撃面・CVE | 小さいが sh/apk 分は残る |
極端に小さい |
| デバッグ | コンテナに入って sh で調査可 |
入って調査は不可(:debug で代替) |
| 向いている用途 | 開発・ステージング、デバッグ容易性重視 | 運用が安定したサービスの本番イメージ |
dive でレイヤー確認
dive はイメージを対話的に掘り下げて、レイヤーごとに追加・変更・削除されたファイルを可視化する CLI。
サイズが想定より大きいときは dive <image> で実行し、各レイヤーの効率(efficiency)や無駄(wastedBytes)を確認する。
よくある無駄は、apt-get install の後に /var/lib/apt/lists を消していない、RUN を分割して同じファイルを複数レイヤーで上書きしている、ビルドステージのアーティファクトがコピーしすぎている、といったケース。
docker history <image> --no-trunc でもコマンドとサイズの概要は確認できるが、ファイル単位の分析には dive が便利。
bash
# インストール後に一発で削除する例
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
curl ca-certificates \
&& rm -rf /var/lib/apt/lists/*