pip установить google-cloud-pubsub не удается установить в контейнер docker

#python #docker #flask

#python #docker #google-cloud-pubsub

Вопрос:

Я пытаюсь использовать эмулятор pupsub. Он запускается, но когда я пытаюсь использовать свой скрипт на python, я получаю следующую ошибку

 ModuleNotFoundError: No module named 'google'
  

Поэтому я пытаюсь установить модуль.

 RUN pip install google-cloud-pubsub
  

ошибка

 ERROR: Command errored out with exit status 1:
     command: /usr/bin/python3.6 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-2hyoy1ly/grpcio/setup.py'"'"'; __file__='"'"'/tmp/pip-install-2hyoy1ly/grpcio/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'rn'"'"', '"'"'n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-m25l52fe
         cwd: /tmp/pip-install-2hyoy1ly/grpcio/
    Complete output (11 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-2hyoy1ly/grpcio/setup.py", line 191, in <module>
        if check_linker_need_libatomic():
      File "/tmp/pip-install-2hyoy1ly/grpcio/setup.py", line 152, in check_linker_need_libatomic
        stderr=PIPE)
      File "/usr/lib/python3.6/subprocess.py", line 729, in __init__
        restore_signals, start_new_session)
      File "/usr/lib/python3.6/subprocess.py", line 1364, in _execute_child
        raise child_exception_type(errno_num, err_msg, err_filename)
    FileNotFoundError: [Errno 2] No such file or directory: 'cc': 'cc'
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
ERROR: Service 'praise-pubsub' failed to build: The command '/bin/sh -c pip install google-cloud-pubsub==0.24.0' returned a non-zero code: 1
  

полный файл Dockerfile

 FROM google/cloud-sdk:alpine
RUN gcloud components install pubsub-emulator

FROM openjdk:jre-alpine


ENV PYTHONUNBUFFERED=1

RUN echo "**** install Python ****" amp;amp; 
    apk add --no-cache python3 amp;amp; 
    if [ ! -e /usr/bin/python ]; then ln -sf python3 /usr/bin/python ; fi amp;amp; 
    
    echo "**** install pip ****" amp;amp; 
    python3 -m ensurepip amp;amp; 
    rm -r /usr/lib/python*/ensurepip amp;amp; 
    pip3 install --no-cache --upgrade pip setuptools wheel amp;amp; 
    if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi

#RUN pip install google-cloud <--- still fails when this is here
#RUN pip install Cython --install-option="--no-cython-compile" <--- still fails
RUN pip install google-cloud-pubsub
COPY --from=0 /google-cloud-sdk/platform/pubsub-emulator /pubsub-emulator
  

Ответ №1:

Я не уверен, почему вы пытаетесь установить python3 и pip3, они оба существуют в базовом образе. В любом случае, этот файл Dockerfile предоставит вам библиотеки python google-cloud-pubsub в красивом чистом изображении

 FROM google/cloud-sdk:alpine

RUN apk add --no-cache --virtual .build-deps 
    linux-headers build-base g   python3-dev 
    amp;amp; pip3 install --no-cache-dir google-cloud-pubsub 
    amp;amp; apk del .build-deps

# add your stuff here
  

Ответ №2:

Похоже, что для установки этого клиента вам нужен gcc, установленный в вашем контейнере docker. Он пытается использовать команду cc для компиляции части библиотеки. Попробуйте установить пакет cython до пакета google-cloud-pubsub.

Также стоит отметить, что версии 0.24.0 клиентской библиотеки Google Cloud Pub / Sub исполнилось три года; теперь она обновлена до версии 1.5.0. Эта проблема с зависимостями (наряду со многими другими), возможно, была исправлена где-то в то же время, поэтому, возможно, стоит обновить до более поздней версии.

Комментарии:

1. Я обновляю до pip install — обновите google-cloud-pubsub, и я думаю, что вы имеете в виду pip install cc. Но у меня такое чувство, что я ошибаюсь, потому что ошибка странная «»Вы пытаетесь запустить очень старую версию Beautiful Soup под Python 3. Это не сработает. К сожалению, использование последней версии pubsub также не сработало.

2. Что делать, если вы pip установите cython?

3. Я тоже устал от этого с помощью pip install Cython —install-option=»—no-cython-compile» и никакого эффекта

Ответ №3:

Если вы посмотрите на загружаемые файлы для grpcio, проблемного пакета, вы увидите, что там есть предварительно скомпилированные двоичные диски:

https://pypi.org/project/grpcio/#files

Итак, почему эта сборка пытается скомпилироваться с нуля? Потому что вы используете Alpine. Alpine не поддерживает двоичные диски (см. https://pythonspeed.com/articles/alpine-docker-python / для более подробного объяснения).

Как говорят другие, вы можете установить компилятор… или вы можете просто прекратить использование образа Docker на основе Alpine, и тогда вы сможете использовать предварительно скомпилированные диски, и ваши сборки будут быстрее. И ваши изображения также будут меньше, поскольку вам не нужно будет устанавливать компилятор (вы можете уменьшить размер Alpine images с помощью многоступенчатых сборок, но это больше работы).