web-dev-qa-db-fra.com

Installation de pandas dans le docker Alpine

J'ai du mal vraiment à essayer d'installer une configuration stable de data science dans docker. Cela devrait être plus facile avec ces outils courants et pertinents.

Ce qui suit est le Dockerfile qui utilisé pour fonctionner, avec un peu de hack, en supprimant pandas du noyau du package et en l'installant séparément, en spécifiant pandas<0.21.0, car, prétendument, les versions supérieures sont en conflit avec numpy.

    FROM Alpine:3.6

    ENV PACKAGES="\
    dumb-init \
    musl \
    libc6-compat \
    linux-headers \
    build-base \
    bash \
    git \
    ca-certificates \
    freetype \
    libgfortran \
    libgcc \
    libstdc++ \
    openblas \
    tcl \
    tk \
    libssl1.0 \
    "

ENV PYTHON_PACKAGES="\
    numpy \
    matplotlib \
    scipy \
    scikit-learn \
    nltk \
    " 

RUN apk add --no-cache --virtual build-dependencies python3 \
    && apk add --virtual build-runtime \
    build-base python3-dev openblas-dev freetype-dev pkgconfig gfortran \
    && ln -s /usr/include/locale.h /usr/include/xlocale.h \
    && python3 -m ensurepip \
    && rm -r /usr/lib/python*/ensurepip \
    && pip3 install --upgrade pip setuptools \
    && ln -sf /usr/bin/python3 /usr/bin/python \
    && ln -sf pip3 /usr/bin/pip \
    && rm -r /root/.cache \
    && pip install --no-cache-dir $PYTHON_PACKAGES \
    && pip3 install 'pandas<0.21.0' \    #<---------- PANDAS
    && apk del build-runtime \
    && apk add --no-cache --virtual build-dependencies $PACKAGES \
    && rm -rf /var/cache/apk/*

# set working directory
WORKDIR /usr/src/app

# add and install requirements
COPY ./requirements.txt /usr/src/app/requirements.txt # other than data science packages go here
RUN pip install -r requirements.txt

# add entrypoint.sh
COPY ./entrypoint.sh /usr/src/app/entrypoint.sh

RUN chmod +x /usr/src/app/entrypoint.sh

# add app
COPY . /usr/src/app

# run server
CMD ["/usr/src/app/entrypoint.sh"]

La configuration ci-dessus fonctionnait auparavant. Ce qui se passe maintenant est que la construction passe, mais pandas échoue à l'importation avec l'erreur suivante:

ImportError: Missing required dependencies ['numpy']

Puisque numpy 1.16.1 a été installé, je ne sais pas lequel numpypandas essaie de trouver plus ...

Quelqu'un sait-il comment obtenir une solution stable pour cela?

[~ # ~] note [~ # ~]: Une solution consistant à extraire une image clé en main docker pour la science des données avec au moins les packages mentionnés ci-dessus, dans Dockerfile ci-dessus, serait également très bien accueilli.


MODIFIER 1 :

Si je déplace l'installation de packages de données dans requirements.txt, comme suggéré dans les commentaires, comme ceci:

requirements.txt

(...)
numpy==1.16.1 # or numpy==1.16.0
scikit-learn==0.20.2
scipy==1.2.1
nltk==3.4   
pandas==0.24.1 # or pandas== 0.23.4
matplotlib==3.0.2 
(...)

et Dockerfile :

# add and install requirements
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip install -r requirements.txt

Il se casse à nouveau à pandas, se plaignant de numpy.

Collecting numpy==1.16.1 (from -r requirements.txt (line 61))
  Downloading https://files.pythonhosted.org/packages/2b/26/07472b0de91851b6656cbc86e2f0d5d3a3128e7580f23295ef58b6862d6c/numpy-1.16.1.Zip (5.1MB)
Collecting scikit-learn==0.20.2 (from -r requirements.txt (line 62))
  Downloading https://files.pythonhosted.org/packages/49/0e/8312ac2d7f38537361b943c8cde4b16dadcc9389760bb855323b67bac091/scikit-learn-0.20.2.tar.gz (10.3MB)
Collecting scipy==1.2.1 (from -r requirements.txt (line 63))
  Downloading https://files.pythonhosted.org/packages/a9/b4/5598a706697d1e2929eaf7fe68898ef4bea76e4950b9efbe1ef396b8813a/scipy-1.2.1.tar.gz (23.1MB)
Collecting nltk==3.4 (from -r requirements.txt (line 64))
  Downloading https://files.pythonhosted.org/packages/6f/ed/9c755d357d33bc1931e157f537721efb5b88d2c583fe593cc09603076cc3/nltk-3.4.Zip (1.4MB)
Collecting pandas==0.24.1 (from -r requirements.txt (line 65))
  Downloading https://files.pythonhosted.org/packages/81/fd/b1f17f7dc914047cd1df9d6813b944ee446973baafe8106e4458bfb68884/pandas-0.24.1.tar.gz (11.8MB)
    Complete output from command python setup.py Egg_info:
    Traceback (most recent call last):
      File "/usr/local/lib/python3.7/site-packages/pkg_resources/__init__.py", line 359, in get_provider
        module = sys.modules[moduleOrReq]
    KeyError: 'numpy'

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-_e5z6o6_/pandas/setup.py", line 732, in <module>
        ext_modules=maybe_cythonize(extensions, compiler_directives=directives),
      File "/tmp/pip-install-_e5z6o6_/pandas/setup.py", line 475, in maybe_cythonize
        numpy_incl = pkg_resources.resource_filename('numpy', 'core/include')
      File "/usr/local/lib/python3.7/site-packages/pkg_resources/__init__.py", line 1144, in resource_filename
        return get_provider(package_or_requirement).get_resource_filename(
      File "/usr/local/lib/python3.7/site-packages/pkg_resources/__init__.py", line 361, in get_provider
        __import__(moduleOrReq)
    ModuleNotFoundError: No module named 'numpy'

Command "python setup.py Egg_info" failed with error code 1 in /tmp/pip-install-_e5z6o6_/pandas/

MODIFIER 2 :

Cela semble être un problème ouvert pandas. Pour plus de détails, veuillez vous référer à:

pandas-dev github

"Malheureusement, cela signifie qu'un fichier requirements.txt est insuffisant pour configurer un nouvel environnement avec pandas installé (comme dans un conteneur Docker)".

  **ImportError**:

  IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!

  Importing the multiarray numpy extension module failed.  Most
  likely you are trying to import a failed build of numpy.
  Here is how to proceed:
  - If you're working with a numpy git repository, try `git clean -xdf`
    (removes all files not under version control) and rebuild numpy.
  - If you are simply trying to use the numpy version that you have installed:
    your installation is broken - please reinstall numpy.
  - If you have already reinstalled and that did not fix the problem, then:
    1. Check that you are using the Python you expect (you're using /usr/local/bin/python),
       and that you have no directories in your PATH or PYTHONPATH that can
       interfere with the Python and numpy versions you're trying to use.
    2. If (1) looks fine, you can open a new issue at
       https://github.com/numpy/numpy/issues.  Please include details on:
       - how you installed Python
       - how you installed numpy
       - your operating system
       - whether or not you have multiple versions of Python installed
       - if you built from source, your compiler versions and ideally a build log

EDIT 3

requirements.txt ---> https://Pastebin.com/0icnx0i


EDIT 4

À partir du 01/12/20, la solution acceptée a commencé à ne plus fonctionner. Maintenant, les sauts de génération ne sont pas à pandas, mais à scipy mais après numpy, lors de la construction de scipy's roue. Voici le journal:

  ----------------------------------------
  ERROR: Failed building wheel for scipy
  Running setup.py clean for scipy
  ERROR: Command errored out with exit status 1:
   command: /usr/bin/python3.6 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-s6nahssd/scipy/setup.py'"'"'; __file__='"'"'/tmp/pip-install-s6nahssd/scipy/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' clean --all
       cwd: /tmp/pip-install-s6nahssd/scipy
  Complete output (9 lines):

  `setup.py clean` is not supported, use one of the following instead:

    - `git clean -xdf` (cleans all files)
    - `git clean -Xdf` (cleans all versioned files, doesn't touch
                        files that aren't checked into the git repo)

  Add `--force` to your command to use it anyway if you must (unsupported).

  ----------------------------------------
  ERROR: Failed cleaning build dir for scipy
Successfully built numpy
Failed to build scipy
ERROR: Could not build wheels for scipy which use PEP 517 and cannot be installed directly

De l'erreur, il semble que le processus de construction utilise python3.6, tandis que j'utilise FROM Alpine:3.7.

Journal complet ici -> https://Pastebin.com/Tw4ubxSA

Et voici le Dockerfile actuel:

https://Pastebin.com/3SftEufx

23
8-Bit Borges

Si vous n'êtes pas lié à Alpine 3.6, l'utilisation d'Alpine 3.7 (ou version ultérieure) devrait fonctionner.

Sur Alpine 3.6, l'installation de matplotlib a échoué pour moi avec ce qui suit:

Collecting matplotlib
  Downloading https://files.pythonhosted.org/packages/26/04/8b381d5b166508cc258632b225adbafec49bbe69aa9a4fa1f1b461428313/matplotlib-3.0.3.tar.gz (36.6MB)
    Complete output from command python setup.py Egg_info:
    Download error on https://pypi.org/simple/numpy/: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833) -- Some packages may not be found!
    Couldn't find index page for 'numpy' (maybe misspelled?)
    Download error on https://pypi.org/simple/: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833) -- Some packages may not be found!
    No local packages or working download links found for numpy>=1.10.0

Cependant, sur Alpine 3.7, cela a fonctionné. Cela peut être dû à un problème de version numpy (voir ici ), mais je ne suis pas en mesure de le dire avec certitude. Passé ce problème, les packages ont été construits et installés avec succès - ce qui prend un bon moment, environ 30 minutes (puisque musl-libc d'Alpine n'est pas compatible avec le format Wheels de Python, tous les packages installés avec pip doivent être construits à partir de la source).

Notez qu'une modification importante est nécessaire: vous ne devez supprimer que le build-runtime package virtuel (apk del build-runtime) après pip install. Le cas échéant, vous pouvez également remplacer numpy 1.16.1 avec 1.16.2, qui est la version livrée (sinon 1.16.2 sera désinstallé et 1.16.1 construit à partir de la source, augmentant encore le temps de construction) - Je n'ai pas encore essayé cela.

Pour référence, voici mes légèrement modifiés Dockerfile et docker build output .

Remarque:

En général, Alpine est choisi comme base pour minimiser la taille de l'image (Alpine est également très glissante, mais a des problèmes de compatibilité avec les applications Linux continentales en raison de glibc/musl). Devoir construire Python du type source battent à cet effet, car vous obtenez une image très gonflée - 900 Mo avant tout nettoyage, ce qui prend également beaucoup de temps à construire. L'image pourrait être considérablement compactée en supprimant tous les artefacts de compilation intermédiaires, les dépendances de construction, etc., mais quand même.

Si vous ne pouvez pas obtenir les versions du package Python dont vous avez besoin pour travailler sur Alpine, sans avoir à les construire à partir des sources, je vous suggère d'essayer d'autres petites images de base plus compatibles telles que debian-slim, ou même ubuntu.

Modifier:

Après "Edit 3" avec des exigences supplémentaires, voici mis à jour Dockerfile et Docker build output . Les packages suivants ont été ajoutés pour satisfaire les dépendances de génération:

postgresql-dev libffi-dev libressl-dev libxml2 libxml2-dev libxslt libxslt-dev libjpeg-turbo-dev zlib-dev

Pour les packages qui n'ont pas pu être créés en raison d'en-têtes spécifiques, j'ai utilisé la recherche de contenu de package d'Alpine pour localiser le package manquant. Spécifiquement pour cffi, le ffi.h l'en-tête était manquant, ce qui nécessite le libffi-dev package: https://pkgs.alpinelinux.org/contents?file=ffi.h&path=&name=&branch=v3.7 .

Alternativement, quand un échec de construction de package n'est pas très clair, les instructions d'installation du package spécifique peuvent être référencées, par exemple, Pillow .

La nouvelle taille d'image, avant tout compactage, est de 1,04 Go. Pour le réduire un peu, vous pouvez supprimer les caches Python et pip:

RUN apk del build-runtime && \
    find -type d -name __pycache__ -Prune -exec rm -rf {} \; && \
    rm -rf ~/.cache/pip

Cela réduira la taille de l'image à 661 Mo, lors de l'utilisation de docker build --squash.

14
valiano

Essayez d'ajouter ceci à votre fichier requirements.txt:

numpy==1.16.0
pandas==0.23.4

Je fais face à la même erreur depuis hier et ce changement l'a résolu pour moi.

4
Ram Krishnan

Cela peut ne pas être complètement pertinent, car c'est la première réponse qui apparaît lors de la recherche d'installation de numpy/pandas a échoué dans Alpine, j'ajoute cette réponse.

Le correctif suivant a fonctionné pour moi (mais il faut plus de temps pour installer pandas/numpy)

apk update
apk --no-cache add curl gcc g++
ln -s /usr/include/locale.h /usr/include/xlocale.h

Essayez maintenant d'installer pandas/numpy

0
codeslord

Un ancien Q & A à Pourquoi faut-il des siècles pour installer Pandas sur Alpine Linux se rapporte.

Si votre objectif est d'obtenir une solution stable sans connaître les écrous et les boulons, pour python 3, vous pouvez simplement construire les éléments suivants (copier-coller de ma réponse de https: // stackoverflow.com/a/50443531/1021819 )

FROM python:3.7-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

Si votre objectif est de comprendre comment obtenir une version stable, la discussion et les images associées pourraient aide aussi ...

0
jtlz2