Я заметил, что установка Pandas и Numpy (это зависимость) в контейнере Docker с использованием базовой ОС Alpine по сравнению с CentOS или Debian занимает гораздо больше времени. Ниже я создал небольшой тест, чтобы продемонстрировать разницу во времени. Помимо нескольких секунд, которые требуется Alpine для обновления и загрузки зависимостей сборки для установки Pandas и Numpy, почему setup.py занимает примерно в 70 раз больше времени, чем установка Debian?
Есть ли способ ускорить установку с использованием Alpine в качестве базового образа или есть другой базовый образ, сопоставимый по размеру с Alpine, который лучше использовать для таких пакетов, как Pandas и Numpy?
Dockerfile.debian
FROM python:3.6.4-slim-jessie
RUN pip install pandas
Создайте образ Debian с помощью Pandas и 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
Создайте образ Alpine с помощью Pandas & 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
Ответы:
Образы на основе 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
в процессе сборки, мы всегда компилируем их из исходных файлов в alpine: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 - дождаться завершения сборки.Конечно, если вы хотите использовать образ Alpine,
pandas
например, в CI, лучший способ сделать это - скомпилировать его один раз, отправить в любой реестр и использовать в качестве базового образа для ваших нужд.РЕДАКТИРОВАТЬ: Если вы хотите использовать образ Alpine,
pandas
вы можете вытащить мой образ докера nickgryg / alpine-pandas . Это образ Python, предварительно скомпилированныйpandas
на платформе Alpine. Это должно сэкономить ваше время.источник
pandas
иnampy
на ней. Эти колеса его не поддерживают. Я показал это в ответе, когда пытался установитьpandas
пакет со своего колеса в образе alpine.pandas
сборку, которая была создана,alpine
а затем кэширована? (это может быть размещено где-нибудь локально)ОТВЕТ: НА 9.03.2020 ДЛЯ PYTHON 3 ЭТО ЕЩЕ НЕТ!
Вот полный рабочий Dockerfile:
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
Сборка очень чувствительна к точным номерам версий python и alpine - неправильный ввод этих значений, кажется, вызывает ошибку Макса Леви
so:libpython3.7m.so.1.0 (missing)
- но теперь все вышесказанное работает для меня.Мой обновленный файл Dockerfile доступен по адресу https://gist.github.com/jtlz2/b0f4bc07ce2ff04bc193337f2327c13b
[Предыдущее обновление:]
ОТВЕТ: НЕТ!
В любом Dockerfile Alpine вы можете просто *
Это потому
numpy
, чтоscipy
и сейчасpandas
все они доступны предварительно наalpine
:https://pkgs.alpinelinux.org/packages?name=*numpy
https://pkgs.alpinelinux.org/packages?name=*scipy&branch=edge
https://pkgs.alpinelinux.org/packages?name=*pandas&branch=edge
Один из способов избежать повторной сборки каждый раз или использования слоя Docker - использовать предварительно собранный, собственный
.apk
пакет / пакет Alpine Linux , напримерhttps://github.com/sgerrand/alpine-pkg-py-pandas
https://github.com/nbgallery/apks
Вы можете собрать их
.apk
один раз и использовать в любом месте вашего Dockerfile :)Это также избавляет вас от необходимости заранее запекать все остальное в образ Docker - т.е. гибкость для предварительной сборки любого образа Docker, который вам нравится.
PS Я разместил заглушку Dockerfile по адресу https://gist.github.com/jtlz2/b0f4bc07ce2ff04bc193337f2327c13b, в которой примерно показано, как создать образ. К ним относятся важные шаги (*):
RUN echo "@community http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories RUN apk update RUN apk add --update --no-cache libgfortran
источник
ВНИМАНИЕ
Посмотрите ответ @ jtlz2 с последним обновлением
УСТАРЕЛО
Итак, пакеты py3-pandas и py3-numpy перемещены в тестовый репозиторий alpine, поэтому вы можете загрузить их, добавив эти строки в свой Dockerfile:
RUN echo "http://dl-8.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \ && apk update \ && apk add py3-numpy py3-pandas
источник
Я просто собираюсь объединить некоторые из этих ответов в один ответ и добавить деталь, я думаю, что она была упущена. Причина, по которой некоторые библиотеки python, особенно оптимизированные библиотеки математики и данных, так долго строятся на alpine, заключается в том, что конвейеры для этих библиотек включают двоичные файлы, предварительно скомпилированные из c / c ++ и связанные с
glibc
общим набором стандартных библиотек c. Debian, Fedora, CentOS все (обычно) используютglibc
, но alpine, чтобы оставаться легким,musl-libc
вместо этого использует . C / C ++ исполняемых файлов сборка наglibc
системе не будет работать в системе безglibc
и то же самое касаетсяmusl
.Pip сначала ищет колесо с правильными двоичными файлами, если не может найти его, он пытается скомпилировать двоичные файлы из источника c / c ++ и связывает их с musl. Во многих случаях это даже не сработает, если у вас нет заголовков Python
python3-dev
или таких инструментов сборки, какmake
.Теперь лучшая сторона, как уже упоминали другие, есть
apk
пакеты с надлежащими двоичными файлами, предоставляемыми сообществом, их использование избавит вас от (иногда длительного) процесса сборки двоичных файлов.источник
Настоящий честный совет: переключитесь на образ на основе Debian, и тогда все ваши проблемы исчезнут.
Alpine для приложений Python работает не очень хорошо.
Вот пример моего
dockerfile
:FROM python:3.7.6-buster RUN pip install pandas==1.0.0 RUN pip install sklearn RUN pip install Django==3.0.2 RUN pip install cx_Oracle==7.3.0 RUN pip install excel RUN pip install djangorestframework==3.11.0
В
python:3.7.6-buster
этом случае более уместно, кроме того, вам не нужна дополнительная зависимость в ОС.Следуйте полезной и недавней статье: https://pythonspeed.com/articles/alpine-docker-python/ :
источник
pip --no-cache
чтобы сбрить немного больше следов. Что вам действительно нужно сделать, так это просто поместить их построчно вrequirements.txt
файл иpip install --no-cache -r requirements.txt
Это сработало для меня:
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" ]
Большая часть кода здесь взята из ответа jtlz2 из того же потока и Faylixe из другого потока.
Оказывается, более легкая версия pandas находится в репозитории Alpine,
py3-numpy
но не устанавливается по тому же пути к файлу, откуда Python по умолчанию считывает импорт. Поэтому вам нужно добавить расширениеENV
. Также помните об альпийской версии.источник
pandas
считается пакетом, поддерживаемым сообществом, поэтому ответы, указывающие наedge/testing
него, не будут работать, поскольку Alpine официально не поддерживает pandas в качестве основного пакета (он все еще работает, он просто не поддерживается основными разработчиками Alpine).Попробуйте этот Dockerfile:
FROM python:3.8-alpine RUN echo "@community http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories \ && apk add py3-pandas@community
Это работает и с ванильным альпийским изображением, используя
FROM alpine:3.12
.источник
alpine требует много времени на установку панд, и размер образа тоже огромен. Я попробовал python: 3.8-slim-buster версию базового образа python. Сборка изображения была очень быстрой, а размер изображения был меньше половины по сравнению с изображением докера alpine python
https://github.com/dguyhasnoname/k8s-cluster-checker/blob/master/Dockerfile
источник