Почему pip (используя --find-links) все еще собирает некоторые зависимости от inte rnet, несмотря на то, что для него существует колесо в многоступенчатой ​​docker сборке? - PullRequest
1 голос
/ 13 марта 2020

У меня есть многоэтапный Dockerfile, где я создаю колеса для зависимостей моего проекта в изображении python, затем копирую колеса в альпийское изображение и выполняю pip install -r ./wheels/requirements.txt --find-links ./wheels.

Кажется, он устанавливается с большинства колес, за исключением некоторых типов, таких как numpy, spacy и gensim, где он достигает целых rnet, чтобы собрать их молнии / гудроны. Почему pip не может найти ссылки для них? Колеса есть. Обычно это что угодно, но установка этих deps на alpine занимает очень много времени .

Вот мой Dockerfile:

FROM python:3.6.10 as builder
ENV PYTHONUNBUFFERED 1
WORKDIR /wheels

COPY ./requirements.txt /wheels/
RUN pip install -U pip \
    && pip wheel -r ./requirements.txt

FROM python:3.6.10-alpine
ENV PYTHONUNBUFFERED=1

RUN apk update
RUN apk add --no-cache \
            --upgrade \
            --repository http://dl-cdn.alpinelinux.org/alpine/edge/main \
        make \
        automake \
        gcc \
        g++ \
        subversion \
        python3-dev \
        gettext \
        libpq \
        postgresql-client \
    && rm -rf /var/cache/apk/*

COPY --from=builder /wheels /wheels
RUN pip install -U pip \
   && pip install -r ./wheels/requirements.txt --find-links ./wheels \
   && rm -rf /wheels \
   && rm -rf /root/.cache/pip/*


WORKDIR /app
COPY ./ /app

COPY ./docker/entrypoint.sh /
ENTRYPOINT [ "/entrypoint.sh" ] 

И мои требования.txt:

asgiref==3.2.3
Django==3.0.2
luhn==0.2.0
nltk==3.4.5
numpy==1.18.1
psycopg2==2.8.4
pytest==5.3.5
pytz==2019.3
spacy==2.2.3
sqlparse==0.3.0
yapf==0.29.0
gensim==3.8.1

Вот пример выходных данных журнала:

Looking in links: ./wheels
Processing /wheels/asgiref-3.2.3-py2.py3-none-any.whl
Processing /wheels/Django-3.0.2-py3-none-any.whl
Processing /wheels/luhn-0.2.0-py3-none-any.whl
Processing /wheels/nltk-3.4.5-py3-none-any.whl
Collecting numpy==1.18.1
  Downloading numpy-1.18.1.zip (5.4 MB)
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to build wheel: started
  Getting requirements to build wheel: finished with status 'done'
    Preparing wheel metadata: started
    Preparing wheel metadata: finished with status 'done'
Processing /wheels/psycopg2-2.8.4-cp36-cp36m-linux_x86_64.whl
Processing /wheels/pytest-5.3.5-py3-none-any.whl
Processing /wheels/pytz-2019.3-py2.py3-none-any.whl
Collecting spacy==2.2.3
  Downloading spacy-2.2.3.tar.gz (5.9 MB)

По сути, я хочу, чтобы numpy и spacy обрабатывались как Django, а остальные команды прямо с колеса.

1 Ответ

1 голос
/ 16 марта 2020

numpy, spacy и genism - все пакеты, объединяющие Python и Cython, и этот интерфейс с C / C ++. В «обычных» ( glib c based) Linux этих пакетах предварительно скомпилированы в двоичные файлы, которые загружаются и устанавливаются напрямую с помощью pip.

Однако на Alpine Linux, эти пакеты недоступны в двоичном виде и должны быть скомпилированы из источника на цели Alpine во время установки.

Причина этого заключается в том, что система сборки колес ( PEP 517 ) не поддерживает Alpine Linux. Двоичные колеса Linux созданы для цели manylinux, которая не совместима с целями на основе musl-lib c, такими как Alpine и Void Linux. Для Alpine нет метки колеса, поэтому даже если у вас уже есть встроенное колесо Alpine, вы не можете установить его напрямую с помощью pip. Вместо этого pip должен извлечь исходный код пакета и построить его на целевом объекте.

Другие пакеты являются чистыми Python, поэтому они используются в соответствии с предоставлением.

Более подробную информацию можно найти по этому вопросу, а также по текущему состоянию в следующем потоке PyPa GitHub:
https://github.com/pypa/manylinux/issues/37

...