distroless イメージとは?OS のないコンテナ
distroless イメージはアプリケーションとそのランタイム依存関係だけを出荷します - shell なし、パッケージマネージャなし、汎用 OS の userland なし。
ほとんどのベースイメージは完全な Linux userland を含みます: shell、パッケージマネージャ、coreutils。distroless イメージはそれらすべてを捨て、アプリの実行に必要なものだけを残します。見返りはより小さく安全なイメージであり、代償はコンテナ内の慣れ親しんだデバッグツールを失うことです。
何が取り除かれるか
- shell なし(
/bin/sh、bash)。 - パッケージマネージャなし(
apt、apk)。 - coreutils や汎用バイナリなし。
- アプリ、そのランタイム、最小限のサポートライブラリだけ。
なぜより安全なのか
小さいイメージはパッケージが少なく、したがって CVE も少なくなります。そして shell がなければ、一般的なポストエクスプロイトの手順 - コンテナ内で shell を起動する - は単純に手がかりを得られません。
デバッグのトレードオフ
shell がないため、distroless コンテナに docker exec して探り回ることはできません。代わりにログ、エフェメラルなデバッグコンテナ、あるいは必要なときだけ shell を追加し直す distroless の :debug バリアントでデバッグします。
マルチステージ build と自然に組み合わさる
distroless はマルチステージ build の最終 stage として真価を発揮します: 完全な toolchain の stage でコンパイルし、そのバイナリを COPY --from で distroless の最終 stage に移します。
CI/CD における distroless
CI pipeline は distroless イメージをビルドし、無駄がなくスキャンがクリーンな artifact を本番へ出荷します。最終イメージが非常に小さいため push と pull が高速で、マネージド runner では重い builder stage が build 間でキャッシュされたまま保たれます。
重要なポイント
- distroless イメージはアプリとランタイムだけを含みます - shell もパッケージマネージャもありません。
- パッケージが少ないことは、脆弱性が少なく攻撃対象領域が小さいことを意味します。
- コンテナ内デバッグをセキュリティと引き換えにします。マルチステージ build と組み合わせましょう。