[解決済み] Alpine LinuxでPandasのインストールに時間がかかる理由
質問
DockerコンテナにPandasとNumpy(依存関係)をインストールするのに、基本OSのAlpineとCentOSやDebianとでは、かなり時間がかかることに気づきました。以下に、その時間差を実証するための小さなテストを作成しました。PandasとNumpyをインストールするためにAlpineがビルドの依存関係を更新してダウンロードするのにかかる数秒は別として、なぜsetup.pyはDebianのインストールに比べて約70倍も時間がかかるのでしょうか?
Alpine をベースイメージとして使用してインストールを高速化する方法はありますか、あるいは Pandas や Numpy のようなパッケージに使用するのに適した Alpine と同等のサイズのベースイメージは他にありますか?
Dockerfile.debian
FROM python:3.6.4-slim-jessie
RUN pip install pandas
Pandas & Numpy を使って Debian イメージを構築する。
[PandasDockerTest] time docker build -t debian-pandas -f Dockerfile.debian . --no-cache
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM python:3.6.4-slim-jessie
---> 43431c5410f3
Step 2/2 : RUN pip install pandas
---> Running in 2e4c030f8051
Collecting pandas
Downloading pandas-0.22.0-cp36-cp36m-manylinux1_x86_64.whl (26.2MB)
Collecting numpy>=1.9.0 (from pandas)
Downloading numpy-1.14.1-cp36-cp36m-manylinux1_x86_64.whl (12.2MB)
Collecting pytz>=2011k (from pandas)
Downloading pytz-2018.3-py2.py3-none-any.whl (509kB)
Collecting python-dateutil>=2 (from pandas)
Downloading python_dateutil-2.6.1-py2.py3-none-any.whl (194kB)
Collecting six>=1.5 (from python-dateutil>=2->pandas)
Downloading six-1.11.0-py2.py3-none-any.whl
Installing collected packages: numpy, pytz, six, python-dateutil, pandas
Successfully installed numpy-1.14.1 pandas-0.22.0 python-dateutil-2.6.1 pytz-2018.3 six-1.11.0
Removing intermediate container 2e4c030f8051
---> a71e1c314897
Successfully built a71e1c314897
Successfully tagged debian-pandas:latest
docker build -t debian-pandas -f Dockerfile.debian . --no-cache 0.07s user 0.06s system 0% cpu 13.605 total
Dockerfile.alpine
FROM python:3.6.4-alpine3.7
RUN apk --update add --no-cache g++
RUN pip install pandas
Pandas & NumpyでAlpineイメージを構築します。
[PandasDockerTest] time docker build -t alpine-pandas -f Dockerfile.alpine . --no-cache
Sending build context to Docker daemon 16.9kB
Step 1/3 : FROM python:3.6.4-alpine3.7
---> 4b00a94b6f26
Step 2/3 : RUN apk --update add --no-cache g++
---> Running in 4b0c32551e3f
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
(1/17) Upgrading musl (1.1.18-r2 -> 1.1.18-r3)
(2/17) Installing libgcc (6.4.0-r5)
(3/17) Installing libstdc++ (6.4.0-r5)
(4/17) Installing binutils-libs (2.28-r3)
(5/17) Installing binutils (2.28-r3)
(6/17) Installing gmp (6.1.2-r1)
(7/17) Installing isl (0.18-r0)
(8/17) Installing libgomp (6.4.0-r5)
(9/17) Installing libatomic (6.4.0-r5)
(10/17) Installing pkgconf (1.3.10-r0)
(11/17) Installing mpfr3 (3.1.5-r1)
(12/17) Installing mpc1 (1.0.3-r1)
(13/17) Installing gcc (6.4.0-r5)
(14/17) Installing musl-dev (1.1.18-r3)
(15/17) Installing libc-dev (0.7.1-r0)
(16/17) Installing g++ (6.4.0-r5)
(17/17) Upgrading musl-utils (1.1.18-r2 -> 1.1.18-r3)
Executing busybox-1.27.2-r7.trigger
OK: 184 MiB in 50 packages
Removing intermediate container 4b0c32551e3f
---> be26c3bf4e42
Step 3/3 : RUN pip install pandas
---> Running in 36f6024e5e2d
Collecting pandas
Downloading pandas-0.22.0.tar.gz (11.3MB)
Collecting python-dateutil>=2 (from pandas)
Downloading python_dateutil-2.6.1-py2.py3-none-any.whl (194kB)
Collecting pytz>=2011k (from pandas)
Downloading pytz-2018.3-py2.py3-none-any.whl (509kB)
Collecting numpy>=1.9.0 (from pandas)
Downloading numpy-1.14.1.zip (4.9MB)
Collecting six>=1.5 (from python-dateutil>=2->pandas)
Downloading six-1.11.0-py2.py3-none-any.whl
Building wheels for collected packages: pandas, numpy
Running setup.py bdist_wheel for pandas: started
Running setup.py bdist_wheel for pandas: still running...
Running setup.py bdist_wheel for pandas: still running...
Running setup.py bdist_wheel for pandas: still running...
Running setup.py bdist_wheel for pandas: still running...
Running setup.py bdist_wheel for pandas: still running...
Running setup.py bdist_wheel for pandas: still running...
Running setup.py bdist_wheel for pandas: finished with status 'done'
Stored in directory: /root/.cache/pip/wheels/e8/ed/46/0596b51014f3cc49259e52dff9824e1c6fe352048a2656fc92
Running setup.py bdist_wheel for numpy: started
Running setup.py bdist_wheel for numpy: still running...
Running setup.py bdist_wheel for numpy: still running...
Running setup.py bdist_wheel for numpy: still running...
Running setup.py bdist_wheel for numpy: finished with status 'done'
Stored in directory: /root/.cache/pip/wheels/9d/cd/e1/4d418b16ea662e512349ef193ed9d9ff473af715110798c984
Successfully built pandas numpy
Installing collected packages: six, python-dateutil, pytz, numpy, pandas
Successfully installed numpy-1.14.1 pandas-0.22.0 python-dateutil-2.6.1 pytz-2018.3 six-1.11.0
Removing intermediate container 36f6024e5e2d
---> a93c59e6a106
Successfully built a93c59e6a106
Successfully tagged alpine-pandas:latest
docker build -t alpine-pandas -f Dockerfile.alpine . --no-cache 0.54s user 0.33s system 0% cpu 16:08.47 total
どのように解決するのですか?
Debian ベースのイメージを使用する場合のみ
python pip
でパッケージをインストールします。
.whl
の形式でインストールします。
Downloading pandas-0.22.0-cp36-cp36m-manylinux1_x86_64.whl (26.2MB)
Downloading numpy-1.14.1-cp36-cp36m-manylinux1_x86_64.whl (12.2MB)
WHL形式は、Pythonソフトウェアをインストールする際に、毎回ソースコードから再ビルドするよりも迅速かつ信頼性の高い方法として開発されました。ソース配布物ではインストールの前にビルドのステップが必要なのに対し、WHLファイルはインストールするターゲットシステム上の正しい場所に移動するだけでよいのです。
ホイールパッケージ
pandas
と
numpy
は、Alpine プラットフォームに基づくイメージではサポートされていません。そのため
python pip
を使ってインストールする場合、常にアルパインのソースファイルからコンパイルします。
Downloading pandas-0.22.0.tar.gz (11.3MB)
Downloading numpy-1.14.1.zip (4.9MB)
で、イメージ構築中のコンテナ内には以下のように表示されています。
/ # ps aux
PID USER TIME COMMAND
1 root 0:00 /bin/sh -c pip install pandas
7 root 0:04 {pip} /usr/local/bin/python /usr/local/bin/pip install pandas
21 root 0:07 /usr/local/bin/python -c import setuptools, tokenize;__file__='/tmp/pip-build-en29h0ak/pandas/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n
496 root 0:00 sh
660 root 0:00 /bin/sh -c gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DTHREAD_STACK_SIZE=0x100000 -fPIC -Ibuild/src.linux-x86_64-3.6/numpy/core/src/pri
661 root 0:00 gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DTHREAD_STACK_SIZE=0x100000 -fPIC -Ibuild/src.linux-x86_64-3.6/numpy/core/src/private -Inump
662 root 0:00 /usr/libexec/gcc/x86_64-alpine-linux-musl/6.4.0/cc1 -quiet -I build/src.linux-x86_64-3.6/numpy/core/src/private -I numpy/core/include -I build/src.linux-x86_64-3.6/numpy/core/includ
663 root 0:00 ps aux
もし
Dockerfile
を少し修正します。
FROM python:3.6.4-alpine3.7
RUN apk add --no-cache g++ wget
RUN wget https://pypi.python.org/packages/da/c6/0936bc5814b429fddb5d6252566fe73a3e40372e6ceaf87de3dec1326f28/pandas-0.22.0-cp36-cp36m-manylinux1_x86_64.whl
RUN pip install pandas-0.22.0-cp36-cp36m-manylinux1_x86_64.whl
を実行すると、次のようなエラーが発生します。
Step 4/4 : RUN pip install pandas-0.22.0-cp36-cp36m-manylinux1_x86_64.whl
---> Running in 0faea63e2bda
pandas-0.22.0-cp36-cp36m-manylinux1_x86_64.whl is not a supported wheel on this platform.
The command '/bin/sh -c pip install pandas-0.22.0-cp36-cp36m-manylinux1_x86_64.whl' returned a non-zero code: 1
残念ながら
pandas
をインストールする唯一の方法は、ビルドが終了するまで待つことです。
もちろん、Alpine イメージに
pandas
で使用したい場合は、一度コンパイルして、任意のレジストリにプッシュし、必要なベースイメージとして使用するのが最良の方法です。
EDITです。
アルパインの画像に
pandas
で使いたいなら、私の
ニックグリグ/アルパインパンダ
docker イメージです。これは python イメージで、コンパイル済みの
pandas
をAlpineプラットフォーム上で実行します。あなたの時間を節約できるはずです。
関連
-
[解決済み] ImportError: IProgress が見つかりませんでした。インストールされていますが、jupyterとipywidgetsをアップデートしてください。
-
[解決済み] モジュール 'pandas' には属性 'Panel' がありません。
-
pandas DataFrame を日付比較に変換するとき、datetimelike 値の .dt アクセッサしか使用できないエラーが発生しました。
-
pandas 基本特性メソッド ランダム整理(3つ) --- 記述統計 / 重複排除カウント / グループソート
-
pandasを使ってexcelのvlookup関数を実装する
-
pandas to_csv to save data with Chinese messy codeの問題と解決法
-
[解決済み] pandasのaxisとはどういう意味ですか?
-
[解決済み】iPython NotebookでDataFrameをテーブルとして表示する。
-
[解決済み] Alpine LinuxでPandasのインストールに時間がかかる理由
-
[解決済み] pandasのデータフレームでNoneをNaNに置き換える
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ピアソン相関計算中に「ValueError: Connectenation axis のすべての入力配列寸法は正確に一致しなければなりません」を取り除くには?
-
[解決済み] ImportError: IProgress が見つかりませんでした。インストールされていますが、jupyterとipywidgetsをアップデートしてください。
-
pandas 基本特性メソッド ランダム整理(3つ) --- 記述統計 / 重複排除カウント / グループソート
-
pandasを使ってexcelのvlookup関数を実装する
-
Pandasシリーズ関連トランスフォーム
-
pandas to_csv to save data with Chinese messy codeの問題と解決法
-
[解決済み】データを3つのセット(トレーニング、検証、テスト)に分割する方法とは?)
-
[解決済み] 確実にインストールされているモジュールがインポートできない
-
[解決済み] Alpine LinuxでPandasのインストールに時間がかかる理由
-
[解決済み] pandasのデータフレームでNoneをNaNに置き換える