#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 с помощью многоступенчатых сборок, но это больше работы).