Docker 在 python2.7-alpine 中的 docker 中安装 pandas 时构建失败
Docker build failing while installing pandas in docker in python2.7-alpine
我是 运行 Docker 中的一个烧瓶应用程序。我也在使用 Pandas。我正在使用 python2.7-alpine 图像。早些时候它工作正常,即我能够使用相同的配置构建图像。
但是现在我无法按照它所说的那样构建图像:
ERROR: Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-Sm9A7D/pandas/
The command '/bin/sh -c pip install -r /tmp/requirements.txt' returned a non-zero code: 1
我无法更改 python 版本。因为我的应用程序是建立在 python2 上的,并且很长一段时间都符合预期。
我的Docker文件
FROM python:2.7-alpine
RUN echo "ipv6" >> /etc/modules;
# echo "http://dl-cdn.alpinelinux.org/alpine/latest-stable/main" > /etc/apk/repositories; \
# echo "http://dl-cdn.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories; \
# echo "http://dl-2.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories; \
# echo "http://dl-3.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories; \
# echo "http://dl-4.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories; \
# echo "http://dl-5.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories
RUN rm -rf /var/cache/apk/* && \
rm -rf /tmp/* && \
apk update && \
apk add --update bash sudo
#================================================================
# add dependencies
#================================================================
RUN apk add --update --no-cache g++ gcc libffi-dev make gpgme p11-kit openssl-dev openssh
#================================================================
# pip and required modules install
#================================================================
### Upgrade pip to prevent errors
RUN pip install setuptools --upgrade
ADD requirements.txt /tmp/requirements.txt
RUN pip install -r /tmp/requirements.txt
完整的错误回溯是:
ERROR: Complete output from command python setup.py egg_info:
ERROR: Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-install-Sm9A7D/pandas/setup.py", line 749, in <module>
**setuptools_kwargs)
File "/usr/local/lib/python2.7/site-packages/setuptools/__init__.py", line 144, in setup
_install_setup_requires(attrs)
File "/usr/local/lib/python2.7/site-packages/setuptools/__init__.py", line 139, in _install_setup_requires
dist.fetch_build_eggs(dist.setup_requires)
File "/usr/local/lib/python2.7/site-packages/setuptools/dist.py", line 717, in fetch_build_eggs
replace_conflicting=True,
File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 782, in resolve
replace_conflicting=replace_conflicting
File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1065, in best_match
return self.obtain(req, installer)
File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1077, in obtain
return installer(requirement)
File "/usr/local/lib/python2.7/site-packages/setuptools/dist.py", line 784, in fetch_build_egg
return cmd.easy_install(req)
File "/usr/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 679, in easy_install
return self.install_item(spec, dist.location, tmpdir, deps)
File "/usr/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 705, in install_item
dists = self.install_eggs(spec, download, tmpdir)
File "/usr/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 890, in install_eggs
return self.build_and_install(setup_script, setup_base)
File "/usr/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 1158, in build_and_install
self.run_setup(setup_script, setup_base, args)
File "/usr/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 1144, in run_setup
run_setup(setup_script, args)
File "/usr/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 253, in run_setup
raise
File "/usr/local/lib/python2.7/contextlib.py", line 35, in __exit__
self.gen.throw(type, value, traceback)
File "/usr/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 195, in setup_context
yield
File "/usr/local/lib/python2.7/contextlib.py", line 35, in __exit__
self.gen.throw(type, value, traceback)
File "/usr/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 166, in save_modules
saved_exc.resume()
File "/usr/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 141, in resume
six.reraise(type, exc, self._tb)
File "/usr/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 154, in save_modules
yield saved
File "/usr/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 195, in setup_context
yield
File "/usr/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 250, in run_setup
_execfile(setup_script, ns)
File "/usr/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 45, in _execfile
exec(code, globals, locals)
File "/tmp/easy_install-2BV0tR/numpy-1.17.0rc1/setup.py", line 31, in <module>
def is_platform_mac():
RuntimeError: Python version >= 3.5 required.
----------------------------------------
ERROR: Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-Sm9A7D/pandas/
The command '/bin/sh -c pip install -r /tmp/requirements.txt' returned a non-zero code: 1
报错告诉你原因:
File "/tmp/easy_install-r9No9Q/numpy-1.17.0rc1/setup.py", line 31, in
def is_platform_mac():
RuntimeError: Python version >= 3.5 required.
来自 pandas 0.23.4 source:我们可以看到 numpy 的最低版本是 1.9.0
:
min_numpy_ver = '1.9.0'
所以,如果你没有自己安装一个版本,pandas 只会安装一个最新的合适版本的 numpy,>1.9.0
适合你,这里是 numpy-1.17.0rc1
,但是它需要 >python3.5
见 here,所以失败发生了。
python_requires='>=3.5'
最后,如果你查看numpy的源代码,你会发现1.16.4
是最后一个支持python2.7的版本,见this,
python_requires='>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*',
所以,最终的解决方案:
Pre-install numpy 1.16.4,然后pandas 找到合适的numpy,不会给你安装最新的numpy。这样就不会报错了,具体步骤如下:
apk update
apk add build-base
pip install numpy==1.16.4
pip install pandas==0.23.4
对于Dockerfile
,将上面的命令添加到一个运行可以修复:
RUN apk update && \
apk add build-base && \
pip install numpy==1.16.4 && \
pip install pandas==0.23.4
另外,你在问题中说:
Earlier it was working fine i.e. I was able to build images with the same configuration.
这是因为 numpy latest version 刚刚在 2019 年 7 月 1 日更新,在此之前,它始终是 1.16.4
版本,python27 没有问题,但现在,事情改变了...
我是 运行 Docker 中的一个烧瓶应用程序。我也在使用 Pandas。我正在使用 python2.7-alpine 图像。早些时候它工作正常,即我能够使用相同的配置构建图像。
但是现在我无法按照它所说的那样构建图像:
ERROR: Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-Sm9A7D/pandas/
The command '/bin/sh -c pip install -r /tmp/requirements.txt' returned a non-zero code: 1
我无法更改 python 版本。因为我的应用程序是建立在 python2 上的,并且很长一段时间都符合预期。
我的Docker文件
FROM python:2.7-alpine
RUN echo "ipv6" >> /etc/modules;
# echo "http://dl-cdn.alpinelinux.org/alpine/latest-stable/main" > /etc/apk/repositories; \
# echo "http://dl-cdn.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories; \
# echo "http://dl-2.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories; \
# echo "http://dl-3.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories; \
# echo "http://dl-4.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories; \
# echo "http://dl-5.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories
RUN rm -rf /var/cache/apk/* && \
rm -rf /tmp/* && \
apk update && \
apk add --update bash sudo
#================================================================
# add dependencies
#================================================================
RUN apk add --update --no-cache g++ gcc libffi-dev make gpgme p11-kit openssl-dev openssh
#================================================================
# pip and required modules install
#================================================================
### Upgrade pip to prevent errors
RUN pip install setuptools --upgrade
ADD requirements.txt /tmp/requirements.txt
RUN pip install -r /tmp/requirements.txt
完整的错误回溯是:
ERROR: Complete output from command python setup.py egg_info:
ERROR: Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-install-Sm9A7D/pandas/setup.py", line 749, in <module>
**setuptools_kwargs)
File "/usr/local/lib/python2.7/site-packages/setuptools/__init__.py", line 144, in setup
_install_setup_requires(attrs)
File "/usr/local/lib/python2.7/site-packages/setuptools/__init__.py", line 139, in _install_setup_requires
dist.fetch_build_eggs(dist.setup_requires)
File "/usr/local/lib/python2.7/site-packages/setuptools/dist.py", line 717, in fetch_build_eggs
replace_conflicting=True,
File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 782, in resolve
replace_conflicting=replace_conflicting
File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1065, in best_match
return self.obtain(req, installer)
File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1077, in obtain
return installer(requirement)
File "/usr/local/lib/python2.7/site-packages/setuptools/dist.py", line 784, in fetch_build_egg
return cmd.easy_install(req)
File "/usr/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 679, in easy_install
return self.install_item(spec, dist.location, tmpdir, deps)
File "/usr/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 705, in install_item
dists = self.install_eggs(spec, download, tmpdir)
File "/usr/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 890, in install_eggs
return self.build_and_install(setup_script, setup_base)
File "/usr/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 1158, in build_and_install
self.run_setup(setup_script, setup_base, args)
File "/usr/local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 1144, in run_setup
run_setup(setup_script, args)
File "/usr/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 253, in run_setup
raise
File "/usr/local/lib/python2.7/contextlib.py", line 35, in __exit__
self.gen.throw(type, value, traceback)
File "/usr/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 195, in setup_context
yield
File "/usr/local/lib/python2.7/contextlib.py", line 35, in __exit__
self.gen.throw(type, value, traceback)
File "/usr/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 166, in save_modules
saved_exc.resume()
File "/usr/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 141, in resume
six.reraise(type, exc, self._tb)
File "/usr/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 154, in save_modules
yield saved
File "/usr/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 195, in setup_context
yield
File "/usr/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 250, in run_setup
_execfile(setup_script, ns)
File "/usr/local/lib/python2.7/site-packages/setuptools/sandbox.py", line 45, in _execfile
exec(code, globals, locals)
File "/tmp/easy_install-2BV0tR/numpy-1.17.0rc1/setup.py", line 31, in <module>
def is_platform_mac():
RuntimeError: Python version >= 3.5 required.
----------------------------------------
ERROR: Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-Sm9A7D/pandas/
The command '/bin/sh -c pip install -r /tmp/requirements.txt' returned a non-zero code: 1
报错告诉你原因:
File "/tmp/easy_install-r9No9Q/numpy-1.17.0rc1/setup.py", line 31, in
def is_platform_mac():
RuntimeError: Python version >= 3.5 required.
来自 pandas 0.23.4 source:我们可以看到 numpy 的最低版本是 1.9.0
:
min_numpy_ver = '1.9.0'
所以,如果你没有自己安装一个版本,pandas 只会安装一个最新的合适版本的 numpy,>1.9.0
适合你,这里是 numpy-1.17.0rc1
,但是它需要 >python3.5
见 here,所以失败发生了。
python_requires='>=3.5'
最后,如果你查看numpy的源代码,你会发现1.16.4
是最后一个支持python2.7的版本,见this,
python_requires='>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*',
所以,最终的解决方案:
Pre-install numpy 1.16.4,然后pandas 找到合适的numpy,不会给你安装最新的numpy。这样就不会报错了,具体步骤如下:
apk update
apk add build-base
pip install numpy==1.16.4
pip install pandas==0.23.4
对于Dockerfile
,将上面的命令添加到一个运行可以修复:
RUN apk update && \
apk add build-base && \
pip install numpy==1.16.4 && \
pip install pandas==0.23.4
另外,你在问题中说:
Earlier it was working fine i.e. I was able to build images with the same configuration.
这是因为 numpy latest version 刚刚在 2019 年 7 月 1 日更新,在此之前,它始终是 1.16.4
版本,python27 没有问题,但现在,事情改变了...