はじめに
やめろ、ではなく、やめたほうがいい。です。自分のユースケースに合ってるか今一度確認することを推奨します。基本的にはAlpineは避けたほうが良い、というのが2021年時点での私の認識です。
なんで?
libcに一般的な互換性が不足しているからです。Ruby、Python、Node.jsなどでNativeモジュールをバンドルしているアプリケーションの場合、パフォーマンスの劣化や互換性の問題にぶち当たる場合があります。
あとは他のベースイメージの軽量化もそれなりに進んできていて、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-debian12
やgcr.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についてはうなすけさんが出してるイメージがありますね
Distroless自体は2017年に以下のカンファレンスで発表されており、筆者は2019年頃から使い始めました。
https://swampup2017.sched.com/event/A6CWswampup2017.sched.com
UBIってなに
Red Hatがメンテしているコンテナイメージです。RHELベースの軽量イメージの上に言語ランタイムが載っています。
参考情報
コンテナビルドミートアップという、コンテナイメージをビルドすることにひたすら命を注ぐ頭のおかしいアツい連中が集まったミートアップがありました。
この回で@stormcat24が発表している以下の資料が非常に参考になるので、何も考えずにベースイメージにAlpineを選択している人たちは改めて見直すことをおすすめします。
追記: その他のベースイメージについて
Debian, Debian Slim, Ubuntuについては長くなるので言及をしないつもりでしたが、ブコメとかでちらほらSlimとかDebianの話が上がってたのでふんわりと。
結論から言うとSlimもめっちゃ良いと思います。お手軽に動かすなら最高かなと。ただ、本番で動かすイメージはAttack surfaceの面で見ても最小限の構成にしたいことがあると思うので、個人的にはDistrolessのほうが本番アプリケーションで使うのには向いているかなという思いもあります。
このスライドも合わせてご覧ください(この当時Distroless選択肢に入れてないんだけどね)