Help us understand the problem. What is going on with this article?

【Python】データ分析環境をコンテナで作るならAlpineベースイメージはやめとけ

More than 1 year has passed since last update.

Numpy/Pandas、scikit-learnを使うPython実行環境を整えようとしているあなたへ。

悪いことは言わない、alpineイメージを使うのはやめとけ

結論から

slimイメージを使いましょう。
3.7系の最新であるバージョン3.7.5のベースイメージサイズの違いは以下の通り。

$ docker images
python              3.7.5-alpine3.10    b11d2a09763f        8 days ago          98.8MB
python              3.7.5-slim          46cf279fff55        11 days ago         179MB
python              3.7.5               023b89039ba4        11 days ago         918MB

あれこれパッケージ追加するのにAlpineは不向き

Pythonでコンテナ環境を立ち上げるみなさんは多分 Numpyscikit-learnを使いたい場面が多いのではないでしょうか。
PandasもバックエンドでNumpyが依存関係にあります。

これらのパッケージは高速・高機能なだけあって重量級のパッケージであり、裏側ではC言語が使われています。
ここで主張したいのは2点です。

  • 毎回追加パッケージ入れるの面倒じゃね?
  • コンパイル待ってられなくね?

以下で実例を述べていきます。

AlpineにNumpyをインストールするまで

Numpyのインストールには必要パッケージがあります。これは、Numpyは内部でC言語が使われており高速性・高機能性が実現されているためです。

以下のようなDockerfileを用意してコンテナをビルドします。
ビルドするまでの時間も計ってみます。

Dockerfile
FROM python:3.7.5-alpine3.10

RUN apk --no-cache add gcc python3-dev musl-dev && \
    pip install --upgrade pip && \
    pip install --no-cache numpy
$ time docker build . -t my_python
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM python:3.7.5-alpine3.10
 ---> b11d2a09763f
Step 2/2 : RUN apk --no-cache add gcc python3-dev musl-dev &&     pip install --upgrade pip && pip install --no-cache numpy

Collecting numpy
  Downloading https://files.pythonhosted.org/packages/b6/d6/be8f975f5322336f62371c9abeb936d592c98c047ad63035f1b38ae08efe/numpy-1.17.3.zip (6.4MB)
Building wheels for collected packages: numpy
  Building wheel for numpy (setup.py): started
  Building wheel for numpy (setup.py): still running...
  Building wheel for numpy (setup.py): still running...
  Building wheel for numpy (setup.py): still running...

めっちゃ時間かかるんですけど...

お。終わりました。

~~
Successfully tagged my_python:latest

real    5m31.468s
user    0m0.043s
sys     0m0.062s

_人人人人人人人人人人人_
> 5m31.468s     <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

5分半かかりました。
※実行環境はCore-i5-626U 上の vCPU 2コア仮想マシン

ちなみに sklearnのインストールはもっとかかり、諦めました。
原因はCollecting numpyの後ろにあります。

Collecting numpy
  Downloading https://files.pythonhosted.org/packages/b6/d6/be8f975f5322336f62371c9abeb936d592c98c047ad63035f1b38ae08efe/numpy-1.17.3.zip (6.4MB)

ZIPファイル、つまりソースコードをそのままダウンロードしてローカル上でビルドしているのです。
そうではなく あらかじめコンパイルされたパッケージであるwheelが見つかれば良いのですが、Alpineイメージには無いのでしょう。

で、結局軽量イメージなわけ?

上記のDockerfileでNumpyは無事インストールできました。
ここで、イメージサイズの軽量性を吟味するためにnumpyはインストールしない(コンテナホストの必要パッケージが整っている)状態でのサイズを比較してみます。
つまり、以下のDockerfileです。

Dockerfile
FROM python:3.7.5-alpine3.10

RUN apk --no-cache add gcc python3-dev musl-dev
$ docker build . -t my_python2
Sending build context to Docker daemon  2.048kB
()
Successfully tagged my_python2:latest
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my_python2          latest              c348cdbf1ce8        5 seconds ago       294MB

_人人人人人人人_
> SIZE    <
> 294MB   <
 ̄Y^Y^Y^Y^Y^Y ̄

ベースイメージpython:3.7.5-slimのイメージは179MBでした。
これ、使う意味ある

一方slimイメージを使うと…?

前提パッケージは何も必要ありません
Dockerflleすら用意せずに結果を確認してみます。

$ docker run -it python:3.7.5-slim bash
root@fba70cf17452:/# pip install numpy
Collecting numpy
  Downloading https://files.pythonhosted.org/packages/00/4a/e34fce8f18c0e052c2b49f1b3713469d855f7662d58ae2b82a88341e865b/numpy-1.17.3-cp37-cp37m-manylinux1_x86_64.whl (20.0MB)
     |████████████████████████████████| 20.0MB 4.2MB/s
Installing collected packages: numpy
Successfully installed numpy-1.17.3

10秒もかからずにインストール完了しました。
ここでのミソは、ダウンロードしているのがZIPファイルではなくビルド済みであるwhlファイルである点です。
scikit-learn(sklearn)も同様に10秒足らずでインストールできました。

まとめ

ベースイメージに色々追加パッケージをインストールするならslimベースイメージ一択です。

もし、本当にシンプルで軽量なランタイムが必要でしたら もちろんAlpineが適しているでしょう。

skokado
しがないエンジニア。
https://portfolio.skokado.me/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away