Pip install oracledb занимает около 9 минут на Alpine (musl), потому что нет колеса musllinux, как избежать сборки из исPython

Программы на Python
Anonymous
Pip install oracledb занимает около 9 минут на Alpine (musl), потому что нет колеса musllinux, как избежать сборки из ис

Сообщение Anonymous »

Я создаю приложение Django внутри образа Docker на основе python:3.13-alpine3.23 как часть конвейера GitLab CI.
После замены cx-Oracle==8.3.0 на oracledb==3.4.2 в файле require.txt уровень pip install -r require.txt в моем
Dockerfile увеличился с ~48 секунд до ~614 секунд, и вся работа конвейера сократилась с 5 минут 37 секунд до 14 минут 23 секунд.
Из журнала BuildKit ~557 из этих дополнительных секунд приходится на сборку одного колеса:

Код: Выделить всё

 #12 21.32  Building wheels for collected packages: pymongo, oracledb
#12 32.37    Building wheel for oracledb (pyproject.toml): started
#12 220.6    Building wheel for oracledb (pyproject.toml): still running...
#12 479.1    Building wheel for oracledb (pyproject.toml): still running...
#12 565.2    Building wheel for oracledb (pyproject.toml): still running...
#12 589.1    Building wheel for oracledb (pyproject.toml): finished with status 'done'
Итак, pip компилирует oracledb из sdist (oracledb-3.4.2.tar.gz, 855 КБ) при каждой сборке.
Что я проверял
  • В PyPI oracledb поставляет множество колес Linux (glibc) и колес macOS/Windows, но я не вижу для
    колеса musllinux_*, поэтому pip возвращается к исходному коду Alpine.
  • Базовый образ — python:3.13-alpine3.23 (musl libc). На этапе сборки уже установлены gcc, g++, musl-dev, libffi-dev,
    openssl-dev, Cargo, python3-dev и т. д., поэтому сборка исходного кода выполняется успешно — просто медленно.
  • Со старым cx-Oracle это не было проблемой, поскольку он был установлен в отдельный выделенный RUN pip install
    --no-build-isolation cx-Oracle==8.3.0, который Docker BuildKit кэшировал отдельно, поэтому он перестраивался только при изменении его
    версии. Теперь oracledb добавлен в общий слой pip install -r require.txt, поэтому любое изменение в
    requirements.txt повторно запускает 9-минутную компиляцию.
Вопрос
Как лучше всего избежать этой 9-минутной сборки исходного кода при каждом запуске CI?

Вернуться в «Python»