Установка панд в докере Alpine
Мне очень тяжело пытаться установить в 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
пытается найти...
Кто-нибудь знает, как получить стабильное решение для этого?
ПРИМЕЧАНИЕ. Было бы очень приветствоваться решение, состоящее из извлечения образа docker
под ключ" для науки о данных, по крайней мере с упомянутыми выше пакетами, в Dockerfile
выше.
РЕДАКТИРОВАТЬ 1:
Если я перенесу установку пакетов данных в requirements.txt
, как это предлагается в комментариях, примерно так:
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
(...)
и 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
. Для более подробной информации, пожалуйста, обратитесь к:
Панда-Дев Гитхуб
"К сожалению, это означает, что файла require.txt недостаточно для настройки новой среды с установленными пандами (как в контейнере 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
РЕДАКТИРОВАТЬ 3
needs.txt ---> https://pastebin.com/0icnx0iu
Ответы
Ответ 1
Если вы не связаны с 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 минут (поскольку Alpine musl-libc не совместим с форматом Python 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. Следующие пакеты были добавлены для удовлетворения зависимостей сборки:
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
.
Ответ 2
Попробуйте добавить это в ваш файл needs.txt:
numpy==1.16.0
pandas==0.23.4
Со вчерашнего дня я столкнулся с той же ошибкой, и это изменение решило ее для меня.