Skip to content
Latchkey

distroless イメージとは?OS のないコンテナ

distroless イメージはアプリケーションとそのランタイム依存関係だけを出荷します - shell なし、パッケージマネージャなし、汎用 OS の userland なし。

ほとんどのベースイメージは完全な Linux userland を含みます: shell、パッケージマネージャ、coreutils。distroless イメージはそれらすべてを捨て、アプリの実行に必要なものだけを残します。見返りはより小さく安全なイメージであり、代償はコンテナ内の慣れ親しんだデバッグツールを失うことです。

何が取り除かれるか

  • shell なし(/bin/shbash)。
  • パッケージマネージャなし(aptapk)。
  • 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 と組み合わせましょう。

関連ガイド