在 Docker 中设置 cassandra 驱动程序 (python)

Set up cassandra driver (python) in Docker

几个月前我使用了一个 docker 文件,它 (1) 使用基础 ubuntu 图像,(2) 安装 miniconda python 发行版,(3) 安装一些 python 使用 miniconda 的库,(4) 运行以下命令为 python.

设置 cassandra-driver
RUN pip install --upgrade pip
RUN pip install cassandra-driver

这在六个月前运行良好。但现在我得到了这个例外。

Step 13 : RUN pip install cassandra-driver
 ---> Running in ba9955650d7c
Collecting cassandra-driver
  Downloading cassandra-driver-3.0.0.tar.gz (186kB)
    Complete output from command python setup.py egg_info:
    warning: no files found matching '*.pyx' under directory 'Cython/Debugger/Tests'
    warning: no files found matching '*.pxd' under directory 'Cython/Debugger/Tests'
    warning: no files found matching '*.h' under directory 'Cython/Debugger/Tests'
    warning: no files found matching '*.pxd' under directory 'Cython/Utility'
    unable to execute 'gcc': No such file or directory
    Unable to find pgen, not compiling formal grammar.
    Traceback (most recent call last):
      File "<string>", line 20, in <module>
      File "/tmp/pip-build-0XzsPv/cassandra-driver/setup.py", line 375, in <module>
        run_setup(None)
      File "/tmp/pip-build-0XzsPv/cassandra-driver/setup.py", line 373, in run_setup
        **kw)
      File "/miniconda/lib/python2.7/distutils/core.py", line 111, in setup
        _setup_distribution = dist = klass(attrs)
      File "/miniconda/lib/python2.7/site-packages/setuptools-19.1.1-py2.7.egg/setuptools/dist.py", line 268, in __init__
      File "/miniconda/lib/python2.7/site-packages/setuptools-19.1.1-py2.7.egg/setuptools/dist.py", line 312, in fetch_build_eggs
      File "/miniconda/lib/python2.7/site-packages/setuptools-19.1.1-py2.7.egg/pkg_resources/__init__.py", line 846, in resolve
      File "/miniconda/lib/python2.7/site-packages/setuptools-19.1.1-py2.7.egg/pkg_resources/__init__.py", line 1091, in best_match
      File "/miniconda/lib/python2.7/site-packages/setuptools-19.1.1-py2.7.egg/pkg_resources/__init__.py", line 1103, in obtain
      File "/miniconda/lib/python2.7/site-packages/setuptools-19.1.1-py2.7.egg/setuptools/dist.py", line 379, in fetch_build_egg
      File "/miniconda/lib/python2.7/site-packages/setuptools-19.1.1-py2.7.egg/setuptools/command/easy_install.py", line 639, in easy_install
      File "/miniconda/lib/python2.7/site-packages/setuptools-19.1.1-py2.7.egg/setuptools/command/easy_install.py", line 669, in install_item
      File "/miniconda/lib/python2.7/site-packages/setuptools-19.1.1-py2.7.egg/setuptools/command/easy_install.py", line 852, in install_eggs
      File "/miniconda/lib/python2.7/site-packages/setuptools-19.1.1-py2.7.egg/setuptools/command/easy_install.py", line 1080, in build_and_install
      File "/miniconda/lib/python2.7/site-packages/setuptools-19.1.1-py2.7.egg/setuptools/command/easy_install.py", line 1068, in run_setup
    distutils.errors.DistutilsError: Setup script exited with error: command 'gcc' failed with exit status 1

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-0XzsPv/cassandra-driver
The command '/bin/sh -c pip install cassandra-driver' returned a non-zero code: 1

可能出了什么问题?是安装包坏了还是我没安装好?

为了安装 cassandra-driver,您需要编译一些 C 源文件,但是您的容器中没有 gcc

unable to execute 'gcc': No such file or directory

尝试在安装 cassandra-driver 之前安装 gccpython-dev 软件包:

RUN apt-get update \
  && apt-get install -y --no-install-recommends \
    python-dev \
    gcc \
  && rm -rf /var/lib/apt/lists/*

python cassandra-driver 现在默认使用 Cython 扩展 since version 2.7.0,但对于那些无法轻松访问 cython 发行版或不了解的人来说,还有一个逃生通道不需要它,这对您来说也是一个不错的选择。 cython 扩展确实提高了性能,但它可能不适合很多情况(尤其是在您没有进行高吞吐量的情况下)。

来自install documentation

By default, this package uses Cython to optimize core modules and build custom extensions. This is not a hard requirement, but is engaged by default to build extensions offering better performance than the pure Python implementation.

This build phase can be avoided using the build switch, or an environment variable:

python setup.py install --no-cython
-or-
pip install --install-option="--no-cython" <spec-or-path>

Alternatively, an environment variable can be used to switch this option regardless of context:

CASS_DRIVER_NO_CYTHON=1 <your script here>