- Alpine собирает Docker билды под Python в 50 раз медленней, а образы в 2 раза тяжелей
- Почему люди рекомендуют Alpine?
- Python образ
- Alpine не поддерживает wheels
- Alpine может быть причиной неожиданных багов в рантайме
- How do I install python on alpine linux?
- 5 Answers 5
- Not the answer you’re looking for? Browse other questions tagged python linux alpine or ask your own question.
- Linked
- Related
- Hot Network Questions
- Subscribe to RSS
- I can’t install python packages by using pip3 on alpine
- 1 Answer 1
- a gcc problem of pip install in alpine and slim #318
- Comments
- ziserendexin commented Jul 26, 2018 •
- Так ли мал Alpine 3.8 Docker для Python 3 runtime
- Шаг 2. Установка cython и tornado
- Шаг 3. Добавляем математику numpy scipy
- Шаг 4. Добавляем графический стек websocket-client pytest pandas bokeh pillow
- Итоги
Alpine собирает Docker билды под Python в 50 раз медленней, а образы в 2 раза тяжелей
Alpine Linux — часто рекомендованный как базовый образ для Docker`а. Вам говорят, что использование Alpine сделает ваши билды меньше, а процесс сборки быстрей.
Но если вы используете Alpine Linux для Python приложений, то он:
- Делает ваши билды намного медленней
- Делает ваши образы больше
- Тратит ваше время
- И в итоге может стать причиной ошибок в рантайме
Давайте рассмотрим почему же Alpine рекомендуют, но почему вам все же не стоит использовать его вместе с Python.
Почему люди рекомендуют Alpine?
Давайте предположим, что нам необходим gcc как часть нашего образа и мы хотим сравнить Alpine Linux vs Ubuntu 18.04, по скорости сборки и конечному размеру образа.
Для начала, скачаем два образа и сравним их размер:
Как вы видите, базовый образ для Alpine намного меньше. Давайте теперь попробуем установить gcc и начнем с Ubuntu:
Написание идеальных Dockerfile выходит за рамки этой статьи
Замерим скорость сборки:
Повторяем все то же самое для Alpine (Dockerfile):
Собираем, смотрим на время и размер сборки:
Как и обещано, образы на базе Alpine собираются быстрей и сами по себе меньше: 15 секунда вместо 30 и размер образа 105MB против 150MB. Это довольно хорошо!
Но если мы переключимся на сборку Python приложения, то все не так радужно.
Python образ
Python приложения часто используют pandas и matplotlib. Поэтому, один из вариантов взять официальный образ на базе Debian, используя такой Dockerfile:
Получаем образ размером в 363MB.
Получится у нас лучше с Alpine? Давайте попробуем:
Alpine не поддерживает wheels
Если вы посмотрите на билд, который базируется на Debian, то вы увидите, что он скачивает matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl.
Это бинарник для wheel. Alpine же скачивает исходники `matplotlib-3.1.2.tar.gz`, так как он не поддерживает стандартный wheels.
Почему? Большинство Linux дистрибутивов используют GNU версию (glibc) стандартной библиотеки C, который по факту необходим каждой программе написанной на C, включая Python. Но Alpine использует `musl`, а так как те бинарники предназначены для `glibc`, они попросту не вариант.
Поэтому, если вы используете Alpine, вам необходимо компилировать весь код, написанный на C, в каждом пакете Python.
Ах, да, список всех таких зависимостей которые, нужно компилировать придется искать самим.
В данном случае получаем такое:
И время билда занимает…
… 25 минут 57 секунд! А размер образа 851MB.
Образы на базе Alpine собираются намного дольше, сами по себе они большего размера и вам еще нужно искать все зависимости. Можно конечно уменьшить размер сборки используя multi-stage builds но это означает, что нужно проделать еще больше работы.
Alpine может быть причиной неожиданных багов в рантайме
- В теории musl совместим с glibc, но на практике различия могут стать причиной многих проблем. И если они будут, то наверняка неприяные. Вот некоторые проблемы, которые могут возникнуть:
- Alpine по умолчанию имеет меньший размер стека потока, что может привести к ошибкам в Python
- Некоторые пользователи обнаружили, что Python приложения работают медленней из-за того как, musl выделяет память (отличается от glibc).
- Один из пользователей обнаружил ошибку при форматировании даты
Наверняка эти ошибки уже исправили, но кто знает сколько их еще.
Источник
How do I install python on alpine linux?
How do I install python3 and python3-pip on an alpine based image (without using a python image)?
5 Answers 5
This is what I use in a Dockerfile for an alpine image:
Look here: https://pkgs.alpinelinux.org/packages So what you are looking for are the python3 and py3-pip packages.
A suitable command to use inside a dockerfile/etc would be:
Note however, that you need to add the community repository since py3-pip is not present on main .
instead of python3-pip install py3-pip
You can try this command
You may use the python official image which offers alpine tags as well. You will probably get the most state-of-the-art python install:
Not the answer you’re looking for? Browse other questions tagged python linux alpine or ask your own question.
Linked
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.10.8.40416
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Источник
I can’t install python packages by using pip3 on alpine
Could not install packages due to an EnvironmentError: [Errno 39] Directory not empty: ‘/tmp/pip-install-xo15v1tw/mock/mock’
I created an alpine container. Dockerfile is
I built and run it.
Then, I installed python3
Then, I tried to install mock package and I got error.
I tried to install other python packages, but I always got the same error. I’m running on the container on WSL. The version of alpine is 3.9.4.
How do I solve this problem?
1 Answer 1
I had the exact same issue running Docker (version 17.09.0 in Ubuntu 16.04, and version 18.06.1 in Ubuntu 18.04) in WSL on Windows 1903, build 18362.145 (my test example is below).
The problem appears to be related to the default overlay2 (and also affects the older overlay ) storage driver. Changing to the vfs storage driver by adding the following to /etc/docker/daemon.json makes pip work correctly:
However, the vfs storage driver is not recommended due to it’s poor performance and high disk usage (it creates a complete copy of the file system in each layer). This is particularly relevant for docker build s where a complete copy of the file system is made for each line in the Dockerfile . So I’m not sure if this is a solution, but it at least indicates where the problem comes from. No other storage drivers appear to be compatible with WSL.
Following are two completely different situations where the overlay2 / overlay storage driver appears to cause errors that do not appear to be related to storage at all. I’m sure this would also cause many other errors. I’m not sure if this was an issue before Windows 1903 (I didn’t try docker in WSL then), and I’m also not sure what could be causing this (is it on the WSL side, or the overlay2 / overlay side? — maybe someone with more knowledge than me would have a comment on this).
My test when using the overlay2 / overlay storage driver is as follows:
When using the vfs storage driver:
I also found that running apt update in the ububtu official image, I got the following output when using the overlay2 / overlay storage driver:
Источник
a gcc problem of pip install in alpine and slim #318
Comments
ziserendexin commented Jul 26, 2018 •
first, it’s ok in 3.7.0-stretch 17453243214e. even i upgrade pip 10 => 18.
docker_py_about_gcc_promblem.txt
and it appear in alpine 4ba354cfad11 and slim 721e295edabf.
error is :
Command «/usr/local/bin/python -u -c «import setuptools, tokenize;__file__=’/tmp/pip-install-yu7dnntc/greenlet/setup.py’;f=getattr(tokenize, ‘open’, open)(__file__);code=f.read().replace(‘\r\n’, ‘\n’);f.close();exec(compile(code, __file__, ‘exec’))» install —record /tmp/pip-record-lqpautx_/install-record.txt —single-version-externally-managed —compile» failed with error code 1 in /tmp/pip-install-yu7dnntc/greenlet/
my dockerfile is
FROM python:3.7.0-stretch WORKDIR /usr/mabo/ COPY ./requirements.txt ./ RUN pip install -r requirements.txt \ && rm requirements.txt
and requirements is :
zope.interface constantly incremental attrs Automat twisted pymodbus3 pendulum redis influxdb msgpack-python toml python-etcd falcon waitress greenlet gevent logbook
in alpine,it’s error in install greenlet.
in slim ,it’s same.
and in alpine, only pip greenlet, also error.
but when i change dockerfile ,and use it in slim
RUN pip install greenlet RUN pip install -r mabopython_requirements_alpine.txt \ && rm mabopython_requirements_alpine.txt
error is different:
Command «/usr/local/bin/python -u -c «import setuptools, tokenize;__file__=’/tmp/pip-install-_xu8ni82/twisted/setup.py’;f=getattr(tokenize, ‘open’, open)(__file__);code=f.read().replace(‘\r\n’, ‘\n’);f.close();exec(compile(code, __file__, ‘exec’))» install —record /tmp/pip-record-_yicobwz/install-record.txt —single-version-externally-managed —compile» failed with error code 1 in /tmp/pip-install-_xu8ni82/twisted/
not greenlet is twisted..Orz
The text was updated successfully, but these errors were encountered:
Источник
Так ли мал Alpine 3.8 Docker для Python 3 runtime
Совсем недавно произошёл релиз минималистичного Alpine Linux 3.8. Очень часто данный linux образ используют в докере, собирая очень компактные окружения для runtime.
Сегодняшняя статья будет рассмотрена в срезе использования runtime системы в докере для Python 3.6.X версий, с различным составом пакетов pip. А так же мы соберём самый новый Python 3.7 в Alpine.
В конце статьи будет представлен размер образа image, занимаемый на диске, в зависимости от состава пакетов pip и произведено сравнение между дистрибутивами Alpine 3.8, Debian 9, Fedora 28.
Итак, приступим: для тестирования дистрибутивы выбраны. Будем собирать следующие docker images:
- Система, ее обновление. И Python3 с обновлённым pip (10 версии)
- п.1 + tornado cython
- п.2 + numpy-scipy
- п.3 + pillow bokeh pandas websocket-client
В результате даных заливок, мы получим различные версии: Python без пакетов, Python с web сервером, Python с пакетами для обработки многопоточных математических вычислений, Python с «графическим» стеком и работы с данными.
Итак, результирующие файлы для Debian и Fedora будут выглядеть у нас так:
Debian
А вот с Alpine 3.8 пока заминка. Официально на момент написания статьи он ещё на вышел, а посмотреть, то хочется:-). Поэтому нам понадобиться их образ системы:
dl-cdn.alpinelinux.org/alpine/v3.8/releases/x86_64
И мы соберём свой Alpine from Sratch:
github.com/gliderlabs/docker-alpine/tree/master/versions/library-3.8/x86_64
Создаём свой докер файл:
Затем копипастим и добавляем в этот файл борку Python 3.6 со страницы github.com/docker-library/python/blob/master/3.6/alpine3.7/Dockerfile
не забыв удалить или закомментировать строку FROM alpine:3.7
И пробуем создать образ с Alpine 3.8 и Python на борту:
Результаты первого шага установка только Python (docker images —all):
- Debian 9 / 513 MB
- Fedora 28 / 387 MB
- Alpine 3.8 / 82.2 MB
Шаг 2. Установка cython и tornado
Начинаем добавлять пакеты pip. Первым установим cython и tornado. Для Debian и Fedora пакеты ставятся без ошибок, а вот Alpine падает с ошибкой:
Придется гуглить и потом уже добавлять библиотеки сборки в Alpine, чтобы pip успешно собрал их из исходного текста. Затем запускать сборку докера снова, затем опять искать зависимости, читать форумы stackoverflow и issues в github и ждать и ждать и ждать.
Поскольку в следующих шагах мы начнём добавлять математические и графические библиотеки в наш образ runtime Python, и чтобы слишком не увеличивать текст данной статьи, я приведу финальные зависимости для Alpine linux:
- Debian 9 / 534 MB
- Fedora 28 / 407 MB
- Alpine 3.8 / 144 MB
Шаг 3. Добавляем математику numpy scipy
- Debian 9 / 763 MB
- Fedora 28 / 626 MB
- Alpine 3.8 / 404 MB MB
Шаг 4. Добавляем графический стек websocket-client pytest pandas bokeh pillow
- Debian 9 / 905 MB
- Fedora 28 / 760 MB
- Alpine 3.8 / 650 MB
В качестве бонуса, попробуем в Alpine 3.8 скомпилировать ещё не вышедший для докера Python 3.7.
Новая версия Python 3.7 представлена 27 июня 2018 года
Размер Alpine 3.8 с Python 3.7 с текущим списком пакетов pip 656 MB
Итоги
Python
- Debian 9 / больше в 6.24х / +430 Mb
- Fedora 28 / больше в 4,7х / +304 Mb
Python tornado cython
- Debian 9 / больше в 3,71х / +390 Mb
- Fedora 28 / больше в 2,82x / +263 Mb
Python tornado cython numpy scipy
- Debian 9 / больше в 1,88 раз / +359 Mb
- Fedora 28 / больше в 1.54 раз / +222 Mb
Python tornado cython numpy scipy websocket-client pytest pandas bokeh pillow
- Debian 9 / больше в 1,39 раз / +255 Mb
- Fedora 28 / больше в 1.16 раз / +110 Mb
При использовании пустого runtime Python, дистрибутив Alpine linux лидер по минимальному размеру. При увеличени количества библиотек pip до tornado+cython+numpy+scipy Alpine все ещё дает заметную экономию в размере на жёстком диске. Одако как только в пакетах появляются графические утилиты для работы с данными для Python, разница практически исчезает.
При большом количестве графических пакетов, оптимальнее выбрать дистрибутив Fedora, чем заниматься компиляцией пакетов в Alpine (компиляция может длиться 1-2 часа), и в результате получить экономию в один или два десятка процентов места на жёстком диске.
UPDATE1: Тестирование проводилось на Fedora Atomic Host: release 28 (Twenty Eight), Version: 2018.5
Источник