Pythonアプリケーションの実行環境としてどのDockerイメージを選べばいいのか、迷ったことはありませんか。自分は毎回悩んでから公式イメージに落ち着くという判断になりがちだったので、ここではっきりさせておこうと思い比較してみることにしました。皆さんの参考になれば嬉しいです。
イメージ選択の評価項目
イメージを選ぶとき、以下の観点があると思います。
観点 | 内容 |
---|---|
安定性 | 頻繁にファイル構成や内容が変わるようでは長期的な使用は難しいため、ある程度の安定性が必要です(あまりないとは思いますが)。 そのため、公式に近いイメージを使いたいところです。 |
イメージサイズ | 一番定量的に評価できるのがイメージのサイズになります。これは小さければ小さいほどありがたいですね。 |
セキュリティのアップデート | セキュリティのアップデートはOSのディストリビューションごとに異なりますが、いつまでサポートしているのかを確認する必要があります。 |
Pythonがインストール済みか | 自分でインストールすることも可能ですが、元からインストールされているほうが手間とビルド時の時間を節約できます。 |
メジャーなディストリビューションの場合
標準的なディストリビューションを使用すれば安定性とセキュリティアップデートのサポート期間も確認できるため非常に安定しています。
しかし、Pythonのアプリケーションを実行するには不要な共通パッケージも多く含まれており、イメージサイズが大きくなりがちです。また、Pythonの最新バージョンは自身でインストールする必要があります。
Alpine Linuxの場合
イメージを小さくするならalpine-linuxが真っ先に候補に上がるのではないでしょうか。しかし、以下のリンクの記事によるとalpineを使用することで最終的にイメージの容量増加やビルド時間の増大など様々な問題が発生してしまうようです。
Using Alpine can make Python Docker builds 50× slower
記事で言及されている内容をまとめると以下のようになります。
- pipでPyPIのライブラリをインストールする際、エラーが起きてしまう可能性がある。alpineではGNUバージョンのCライブラリではなくmusl Cライブラリが使用されているのが原因。
- GNUバージョンで使用できるbinary形式のものがPyPIではメジャーだが、muslの環境で使用する場合は用意されているbinaryを使用できず、ほとんどコンパイルし直さなければならない。そのためビルド時間が伸びてしまう。
- musl Cライブラリを使用していることによる予想し辛いバグが出る可能性が存在する
そのため、alpineは素のイメージサイズは小さいのですが、Pythonの実行環境としては不安が残ります。
Docker公式のPythonイメージ
PythonをDockerで使う場合は基本的にこのイメージを使う人が多いのではないでしょうか。大まかにタグの種類は以下になります。
イメージ種類 | 最新の一つ前のタグ(2020/03時点) | サイズ | 備考 |
---|---|---|---|
alpine | 3.8.1-alpine3.11 | 109MB | こちらにもAlpineのイメージが存在しますが、上記に記載したデメリットがあるためお勧めではありません。 |
buster | 3.8.1-buster | 933MB | Debianの最新バージョンであるBusterをベースとしたイメージです。多くの基本的なパッケージがインストールされているため軽量ではありませんが、汎用的な用途の場合はこちらを使うといいでしょう。 |
buster-slim | 3.8.1-slim-buster | 193MB | Debianのイメージの内の共通パッケージを省き、その分イメージサイズが小さくなったバージョンです。Pythonアプリケーションのみを使用するのであれば問題はなさそうです。 |
タグを比較してみると、メインのDebianイメージに加えてslimバージョンも存在していることが分かります。こちらはPythonの実行に特化したイメージで、それ以外の多くの機能をバッサリ落としているようです。python-dockerページの注意書きに、「Python実行用途のみでイメージサイズに厳しい制限がある場合にslimを使用し、それ以外ではデフォルトのイメージをお勧めします」と記載してありました。コンテナ内でどこまで実行するかによって選択が変わってきますね。
結論
上記の検討結果から、Pythonアプリケーションをシンプルに動作させるのに適したDockerImageはDebian Buster slimという結論に至りました。イメージサイズは198MBで中々コンパクトですね。