pip install google-cloud-pubsub 在 docker 容器中安装失败

Posted

技术标签:

【中文标题】pip install google-cloud-pubsub 在 docker 容器中安装失败【英文标题】:pip install google-cloud-pubsub fails install in docker container 【发布时间】:2020-09-27 07:22:36 【问题描述】:

我正在尝试使用 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('"'"'\r\n'"'"', '"'"'\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 ****" && \
    apk add --no-cache python3 && \
    if [ ! -e /usr/bin/python ]; then ln -sf python3 /usr/bin/python ; fi && \
    \
    echo "**** install pip ****" && \
    python3 -m ensurepip && \
    rm -r /usr/lib/python*/ensurepip && \
    pip3 install --no-cache --upgrade pip setuptools wheel && \
    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 \
    && pip3 install --no-cache-dir google-cloud-pubsub \
    && apk del .build-deps

# add your stuff here

【讨论】:

【参考方案2】:

看起来要安装该客户端,您需要在 docker 容器中安装 gcc。它正在尝试使用 cc 命令来编译库的一部分。尝试在 google-cloud-pubsub 包之前安装 cython 包。

另外值得注意的是,Google Cloud Pub/Sub 客户端库的 0.24.0 版本已经使用了三年;现在升级到 1.5.0 版。这个依赖问题(以及许多其他问题)可能在此期间已在某处得到修复,因此可能值得更新到更新的版本。

【讨论】:

我升级到 pip install --upgrade google-cloud-pubsub 我认为你指的是 pip install cc。但我有一种感觉我错了,因为错误很奇怪`“你正试图在 Python 3 下运行一个非常旧的 Beautiful Soup 版本。这将不起作用。使用最新的 pubsub 版本也很遗憾。跨度> 如果你 pip install cython 怎么办? 我也厌倦了 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/ 了解更多说明)。

正如其他人所说,您可以安装编译器...或者您可以停止使用基于 Alpine 的 Docker 映像,然后您将能够使用预编译的***,并且您的构建会更快。而且您的图像也会更小,因为您不需要安装编译器(您可以通过多阶段构建使 Alpine 图像更小,但这需要更多工作)。

【讨论】:

以上是关于pip install google-cloud-pubsub 在 docker 容器中安装失败的主要内容,如果未能解决你的问题,请参考以下文章

pip install url安装报错,求解决办法

pip install PIL报错问题解决

python包管理工具pip install详解

Python用pip install安装Scipy报错

pip install -U selenium 报错为啥呢?

python -m pip install --upgrade pip 更新一直报错