Dock Stay
イメージを軽量化する - image size の使い方・オプション・サンプル

イメージを軽量化する - image size

軽量ベースイメージの選定、不要ファイルの削除、マルチステージの活用でイメージサイズを抑える。

概念図

image size diagram

構文

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 MB

alpine と 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/*

関連トピック