Установка панд в докере Alpine - PullRequest
0 голосов
/ 26 февраля 2019

У меня действительно трудное время, когда я пытаюсь установить стабильную конфигурацию пакета данных в docker.Это должно быть проще с такими основными, соответствующими инструментами.

Ниже приведен Dockerfile , который использовал для работы, с небольшим взломом, удалив pandas из ядра пакета и установив его отдельно, указав pandas<0.21.0, потому что, как утверждается, более высокие версии конфликтуют с 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"]

Для работы использовалась конфигурация выше. сейчас состоит в том, что сборка проходит, но pandas не удается при импорте со следующей ошибкой:

ImportError: Missing required dependencies ['numpy']

Так как numpy 1.16.1 был установлен, я не знаю, какой numpy pandas пытается найти ...

Кто-нибудь знает, как получить стабильное решение для этого?

ПРИМЕЧАНИЕ : Решение, состоящее из извлечения из 10 * * готового изображения для науки о данных как минимум с упомянутыми выше пакетами в Dockerfile выше, также будет приветствоваться.


РЕДАКТИРОВАТЬ 1 :

Если я перенесу установку пакетов данных в requirements.txt, как указано в комментариях, примерно так::

needs.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 
(...)

и Dockerfile :

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

Он снова прерывается на pandasс жалобами на 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/

РЕДАКТИРОВАТЬ 2 :

Это похоже на открытую pandas проблему.Для получения более подробной информации, пожалуйста, обратитесь к:

pandas-dev github

"К сожалению, это означает, что файла require.txt недостаточно для настройки новогосреда с установленными пандами (как в док-контейнере) ".

  **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

РЕДАКТИРОВАТЬ 3

needs.txt --> https://pastebin.com/0icnx0iu

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Если вы не связаны с Alpine 3.6, использование Alpine 3.7 (или более поздней версии) должно работать.

На Alpine 3.6 установка matplotlib для меня завершилась неудачно со следующим:

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

Однако на Alpine 3.7 все заработало.Это может быть связано с проблемой numpy управления версиями (см. здесь ), но я не могу сказать точно.После этой проблемы пакеты были успешно собраны и установлены - на это ушло около 30 минут (поскольку musl-libc в Alpine не совместим с форматом Python's Wheels, все пакеты, установленные с помощью pip, должны быть собраны из исходного кода).

Обратите внимание, что необходимо сделать одно важное изменение: вы должны удалить виртуальный пакет build-runtime (apk del build-runtime) только после pip install.Также, если применимо, вы можете заменить numpy 1.16.1 на 1.16.2, которая является поставляемой версией (в противном случае 1.16.2 будет удалена, а 1.16.1 собрана из исходного кода, что еще больше увеличит время сборки) - я не пробовалэто, однако.

Для справки, вот мои слегка модифицированные Dockerfile и Docker выходные данные сборки .

Примечание:

Обычно Alpine выбирают в качестве основы для минимизации размера изображения (в других случаях Alpine очень гладкий, но имеет проблемы с совместимостью с приложениями для ОС Linux из-за glibc / musl).Необходимость сборки пакетов Python из исходного кода превосходит эту цель, поскольку вы получаете очень раздутый образ - 900 МБ перед любой очисткой, на сборку которой также уходит много времени.Изображение может быть сильно сжато путем удаления всех промежуточных артефактов компиляции, зависимостей сборки и т. Д., Но все же.

Если вы не можете получить версии пакета Python, вам нужно работать на Alpine, не собирая их изисточник, я бы предложил попробовать другие небольшие и более совместимые базовые изображения, такие как debian-slim или даже ubuntu.

Редактировать:

После "Редактировать 3"с добавленными требованиями здесь обновляются Dockerfile и Docker build output .Для удовлетворения зависимостей сборки были добавлены следующие пакеты:

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

Для пакетов, которые не удалось собрать из-за определенных заголовков, я использовал поиск содержимого пакета Alpine, чтобы найти отсутствующий пакет.Специально для cffi отсутствовал заголовок ffi.h, для которого требуется пакет libffi-dev: https://pkgs.alpinelinux.org/contents?file=ffi.h&path=&name=&branch=v3.7.

В качестве альтернативы, если сбой сборки пакета не очень понятен, инструкции по установке конкретного пакетаможно сослаться, например, на Подушка .

Новый размер изображения перед любым сжатием составляет 1,04 ГБ.Чтобы немного сократить его, вы можете удалить кэши Python и pip:

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

Это уменьшит размер изображения до 661 МБ при использовании docker build --squash.

0 голосов
/ 29 мая 2019

Это может быть не совсем уместно, так как это первый ответ, который появляется при поиске установки numpy / pandas в Alpine. Я добавляю этот ответ.

Следующее исправление сработало для меня (но оноустановка pandas / numpy занимает больше времени)

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

Теперь попробуйте установить pandas / numpy

0 голосов
/ 27 февраля 2019

Попытайтесь добавить это в ваш файл needs.txt:

numpy==1.16.0
pandas==0.23.4

Со вчерашнего дня я столкнулся с той же ошибкой, и это изменение решило ее для меня.

...