146 votes

Pourquoi l'installation de Pandas sur Alpine Linux prend-elle du temps ?

J'ai remarqué que l'installation de Pandas et Numpy (sa dépendance) dans un conteneur Docker en utilisant l'OS de base Alpine par rapport à CentOS ou Debian prend beaucoup plus de temps. J'ai créé un petit test ci-dessous pour démontrer la différence de temps. En dehors des quelques secondes que prend Alpine pour mettre à jour et télécharger les dépendances de construction pour installer Pandas et Numpy, pourquoi le setup.py prend-il environ 70x plus de temps que pour une installation Debian ?

Y a-t-il un moyen d'accélérer l'installation en utilisant Alpine comme image de base ou existe-t-il une autre image de base de taille comparable à Alpine qu'il vaut mieux utiliser pour des paquets comme Pandas et Numpy ?

Dockerfile.debian

FROM python:3.6.4-slim-jessie

RUN pip install pandas

Construire une image Debian avec Pandas et Numpy :

[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

Construire une image alpine avec Pandas et Numpy :

[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

2 votes

.apk maintenant disponible, donc plus besoin de construire à partir de la source - pkgs.alpinelinux.org/packages?name= *pandas&branches=bords

2 votes

@jtlz2, pandas n'est pas disponible sur la branche bordant Alpine. ce qui est dommage...

0 votes

@fccoelho Il est à nouveau disponible maintenant !

2voto

Bishwas Mishra Points 575

Cela a marché pour moi :

FROM python:3.8-alpine
RUN echo "@testing http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
RUN apk add --update --no-cache py3-numpy py3-pandas@testing
ENV PYTHONPATH=/usr/lib/python3.8/site-packages

COPY . /app
WORKDIR /app

RUN pip install -r requirements.txt

EXPOSE 5003 
ENTRYPOINT [ "python" ] 
CMD [ "app.py" ]

La plupart du code ici provient de la réponse de jtlz2 de ce même fil et Faylixe d'un autre fil.

Il s'avère que la version allégée des pandas se trouve dans le dépôt alpin. py3-numpy mais il n'est pas installé dans le même chemin de fichier à partir duquel Python lit les importations par défaut. Par conséquent, vous devez ajouter l'option ENV . Faites également attention à la version alpine.

1voto

Dans ce cas, l'alpin n'est pas la meilleure solution ; changez l'alpin pour le mince :

DE python:3.8.3-alpine

Changez ça :

FROM python:3.8.3-slim

Dans mon cas, le problème a été résolu grâce à cette petite modification.

0voto

Z4-tier Points 1755

pandas est considéré comme un paquet soutenu par la communauté, donc les réponses pointant vers edge/testing ne fonctionneront pas, car Alpine ne prend pas officiellement en charge pandas en tant que package de base (il fonctionne toujours, mais il n'est pas pris en charge par les principaux développeurs d'Alpine).

Essayez ce fichier Docker :

FROM python:3.8-alpine
RUN echo "@community http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories \
&& apk add py3-pandas@community
ENV PYTHONPATH="/usr/lib/python3.8/site-packages"

Cela fonctionne aussi pour l'image Alpine vanille, en utilisant FROM alpine:3.12 .


Mise à jour : merci à @cegprakash d'avoir soulevé la question de savoir comment travailler avec cette configuration lorsque l'on dispose aussi d'une requirements.txt qui doivent être satisfaites à l'intérieur du conteneur.

J'ai ajouté une ligne au snippet du Dockerfile pour exporter le fichier PYTHONPATH dans le runtime du conteneur. Si vous faites cela, il importe peu de savoir si pandas o numpy sont inclus ou non dans le fichier d'exigences (à condition qu'ils soient rattachés à la même version que celle qui a été installée par l'intermédiaire de l'option apk ).

La raison pour laquelle cela est nécessaire est que apk installe le py3-pands@community paquet sous /usr/lib mais cet emplacement n'est pas sur la liste par défaut PYTHONPATH que pip avant d'installer de nouveaux paquets. Si nous n'incluons pas cette étape pour l'ajouter, pip y python ne trouvera pas le paquet et pip va essayer de le télécharger et de l'installer sous /usr/local ce qui est ce que nous essayons d'éviter.

Et étant donné que nous vraiment veulent s'assurer que pip n'essaie pas d'installer pandas Je vous suggère de no inclure pandas o numpy en el requirements.txt si vous les avez déjà installés avec apk en utilisant la méthode ci-dessus. C'est juste une petite assurance supplémentaire que les choses se passeront comme prévu.

-1voto

Mukund Sharma Points 74

Alpine prend beaucoup de temps pour installer pandas et la taille de l'image est également énorme. J'ai essayé la version python:3.8-slim-buster de l'image de base de python. La construction de l'image a été très rapide et la taille de l'image était inférieure à la moitié par rapport à l'image docker de python alpine.

https://github.com/dguyhasnoname/k8s-cluster-checker/blob/master/Dockerfile

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X