inductor's blog

nothing but self note :)

軽量Dockerイメージに安易にAlpineを使うのはやめたほうがいいという話

はじめに

やめろ、ではなく、やめたほうがいい。です。自分のユースケースに合ってるか今一度確認することを推奨します。基本的にはAlpineは避けたほうが良い、というのが2021年時点での私の認識です。

なんで?

libcに一般的な互換性が不足しているからです。Ruby、Python、Node.jsなどでNativeモジュールをバンドルしているアプリケーションの場合、パフォーマンスの劣化や互換性の問題にぶち当たる場合があります。

superuser.com

あとは他のベースイメージの軽量化もそれなりに進んできていて、Alpineが定番軽量イメージと言う認識は2018年頃には消えつつあったかなという認識でいます。

どうすりゃええねん

※Debian Slimがあるやんってツッコミ結構もらったんですが、Slimは当たり前過ぎてもう紹介しなくていいかなっていう甘えで省略していました。よろしくおねがいします。

Distroless、あるいはUBIの利用を検討してはいかがでしょうか。

Distrolessってなに

GoogleがメンテしているDockerのベースイメージ群です。以下のような言語環境をサポートしています。

  • gcr.io/distroless/static-debian12
  • gcr.io/distroless/base-debian12
  • gcr.io/distroless/base-nossl-debian12
  • gcr.io/distroless/java17-debian12
  • gcr.io/distroless/cc-debian12
  • gcr.io/distroless/nodejs22-debian12
  • gcr.io/distroless/python3-debian12

純粋なベースイメージなら、gcr.io/distroless/static-debian12gcr.io/distroless/base-debian12が選択肢としてありえますし、言語ランタイムベースであれば、gcr.io/distroless/nodejs22-debian12:debug (シェル付)gcr.io/distroless/nodejs22-debian12 (シェル無)などといった選択肢もあります。

こちらのイメージを、マルチステージビルドと組み合わせて使用することで軽量かつ安全、高互換なランタイム環境が提供されます。

なお、staticとbaseの違いについては公式ドキュメントに記述があります。簡単に言えばglibcやlibsslなどを使いたい場合はbase、それ以外の軽量環境はstaticで良いですよ、という格好で、GoやC++、RustなどのELFバイナリーで動くプログラムであればこの環境を選択するのが良いでしょう。

https://github.com/GoogleContainerTools/distroless/blob/main/base/README.md

Rubyについてはうなすけさんが出してるイメージがありますね

github.com

Distroless自体は2017年に以下のカンファレンスで発表されており、筆者は2019年頃から使い始めました。

https://swampup2017.sched.com/event/A6CWswampup2017.sched.com

UBIってなに

Red Hatがメンテしているコンテナイメージです。RHELベースの軽量イメージの上に言語ランタイムが載っています。

参考情報

コンテナビルドミートアップという、コンテナイメージをビルドすることにひたすら命を注ぐ頭のおかしいアツい連中が集まったミートアップがありました。

build.connpass.com

この回で@stormcat24が発表している以下の資料が非常に参考になるので、何も考えずにベースイメージにAlpineを選択している人たちは改めて見直すことをおすすめします。

speakerdeck.com

追記: その他のベースイメージについて

Debian, Debian Slim, Ubuntuについては長くなるので言及をしないつもりでしたが、ブコメとかでちらほらSlimとかDebianの話が上がってたのでふんわりと。

結論から言うとSlimもめっちゃ良いと思います。お手軽に動かすなら最高かなと。ただ、本番で動かすイメージはAttack surfaceの面で見ても最小限の構成にしたいことがあると思うので、個人的にはDistrolessのほうが本番アプリケーションで使うのには向いているかなという思いもあります。

speakerdeck.com

このスライドも合わせてご覧ください(この当時Distroless選択肢に入れてないんだけどね)