在 docker Alpine 中安装 pandas
Posted
技术标签:
【中文标题】在 docker Alpine 中安装 pandas【英文标题】:Installing pandas in docker Alpine 【发布时间】:2019-07-20 06:44:41 【问题描述】:我很难真的尝试在docker
中安装稳定的数据科学包配置。使用这种主流的相关工具应该会更容易。
以下是使用工作的Dockerfile,有点破解,从包核心中删除pandas
并单独安装,指定@987654327 @,因为据称更高版本与 numpy
冲突。
FROM alpine:3.6
ENV PACKAGES="\
dumb-init \
musl \
libc6-compat \
linux-headers \
build-base \
bash \
git \
ca-certificates \
freetype \
libgfortran \
libgcc \
libstdc++ \
openblas \
tcl \
tk \
libssl1.0 \
"
ENV PYTHON_PACKAGES="\
numpy \
matplotlib \
scipy \
scikit-learn \
nltk \
"
RUN apk add --no-cache --virtual build-dependencies python3 \
&& apk add --virtual build-runtime \
build-base python3-dev openblas-dev freetype-dev pkgconfig gfortran \
&& ln -s /usr/include/locale.h /usr/include/xlocale.h \
&& python3 -m ensurepip \
&& rm -r /usr/lib/python*/ensurepip \
&& pip3 install --upgrade pip setuptools \
&& ln -sf /usr/bin/python3 /usr/bin/python \
&& ln -sf pip3 /usr/bin/pip \
&& rm -r /root/.cache \
&& pip install --no-cache-dir $PYTHON_PACKAGES \
&& pip3 install 'pandas<0.21.0' \ #<---------- PANDAS
&& apk del build-runtime \
&& apk add --no-cache --virtual build-dependencies $PACKAGES \
&& rm -rf /var/cache/apk/*
# set working directory
WORKDIR /usr/src/app
# add and install requirements
COPY ./requirements.txt /usr/src/app/requirements.txt # other than data science packages go here
RUN pip install -r requirements.txt
# add entrypoint.sh
COPY ./entrypoint.sh /usr/src/app/entrypoint.sh
RUN chmod +x /usr/src/app/entrypoint.sh
# add app
COPY . /usr/src/app
# run server
CMD ["/usr/src/app/entrypoint.sh"]
上面的配置曾经可以工作。 现在会发生什么,构建确实通过了,但是pandas
在导入时失败并出现以下错误:
ImportError: Missing required dependencies ['numpy']
自从安装了numpy 1.16.1
,我不知道numpy
pandas
正在尝试找到哪个...
有谁知道如何为此获得稳定的解决方案?
注意:一个解决方案也非常受欢迎,该解决方案包括从数据科学的交钥匙docker
图像中提取至少上述软件包到上述Dockerfile
。 p>
编辑 1:
如果我按照 cmets 中的建议将数据包的安装移动到 requirements.txt
,如下所示:
requirements.txt
(...)
numpy==1.16.1 # or numpy==1.16.0
scikit-learn==0.20.2
scipy==1.2.1
nltk==3.4
pandas==0.24.1 # or pandas== 0.23.4
matplotlib==3.0.2
(...)
和Dockerfile:
# add and install requirements
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip install -r requirements.txt
它在pandas
再次中断,抱怨numpy
。
Collecting numpy==1.16.1 (from -r requirements.txt (line 61))
Downloading https://files.pythonhosted.org/packages/2b/26/07472b0de91851b6656cbc86e2f0d5d3a3128e7580f23295ef58b6862d6c/numpy-1.16.1.zip (5.1MB)
Collecting scikit-learn==0.20.2 (from -r requirements.txt (line 62))
Downloading https://files.pythonhosted.org/packages/49/0e/8312ac2d7f38537361b943c8cde4b16dadcc9389760bb855323b67bac091/scikit-learn-0.20.2.tar.gz (10.3MB)
Collecting scipy==1.2.1 (from -r requirements.txt (line 63))
Downloading https://files.pythonhosted.org/packages/a9/b4/5598a706697d1e2929eaf7fe68898ef4bea76e4950b9efbe1ef396b8813a/scipy-1.2.1.tar.gz (23.1MB)
Collecting nltk==3.4 (from -r requirements.txt (line 64))
Downloading https://files.pythonhosted.org/packages/6f/ed/9c755d357d33bc1931e157f537721efb5b88d2c583fe593cc09603076cc3/nltk-3.4.zip (1.4MB)
Collecting pandas==0.24.1 (from -r requirements.txt (line 65))
Downloading https://files.pythonhosted.org/packages/81/fd/b1f17f7dc914047cd1df9d6813b944ee446973baafe8106e4458bfb68884/pandas-0.24.1.tar.gz (11.8MB)
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/pkg_resources/__init__.py", line 359, in get_provider
module = sys.modules[moduleOrReq]
KeyError: 'numpy'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-install-_e5z6o6_/pandas/setup.py", line 732, in <module>
ext_modules=maybe_cythonize(extensions, compiler_directives=directives),
File "/tmp/pip-install-_e5z6o6_/pandas/setup.py", line 475, in maybe_cythonize
numpy_incl = pkg_resources.resource_filename('numpy', 'core/include')
File "/usr/local/lib/python3.7/site-packages/pkg_resources/__init__.py", line 1144, in resource_filename
return get_provider(package_or_requirement).get_resource_filename(
File "/usr/local/lib/python3.7/site-packages/pkg_resources/__init__.py", line 361, in get_provider
__import__(moduleOrReq)
ModuleNotFoundError: No module named 'numpy'
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-_e5z6o6_/pandas/
编辑 2:
这似乎是一个公开的pandas
问题。更多详情请参考:
pandas-dev github
“很遗憾,这意味着 requirements.txt 文件不足以设置安装了 pandas 的新环境(例如在 docker 容器中)”。
**ImportError**:
IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!
Importing the multiarray numpy extension module failed. Most
likely you are trying to import a failed build of numpy.
Here is how to proceed:
- If you're working with a numpy git repository, try `git clean -xdf`
(removes all files not under version control) and rebuild numpy.
- If you are simply trying to use the numpy version that you have installed:
your installation is broken - please reinstall numpy.
- If you have already reinstalled and that did not fix the problem, then:
1. Check that you are using the Python you expect (you're using /usr/local/bin/python),
and that you have no directories in your PATH or PYTHONPATH that can
interfere with the Python and numpy versions you're trying to use.
2. If (1) looks fine, you can open a new issue at
https://github.com/numpy/numpy/issues. Please include details on:
- how you installed Python
- how you installed numpy
- your operating system
- whether or not you have multiple versions of Python installed
- if you built from source, your compiler versions and ideally a build log
编辑 3
requirements.txt ---> https://pastebin.com/0icnx0iu
编辑 4
截至 2020 年 1 月 12 日,已接受的解决方案开始不再起作用。
现在,构建中断不是在pandas
,而是在scipy
,而是在numpy
之后,同时构建scipy's
***。这是日志:
----------------------------------------
ERROR: Failed building wheel for scipy
Running setup.py clean for scipy
ERROR: Command errored out with exit status 1:
command: /usr/bin/python3.6 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-s6nahssd/scipy/setup.py'"'"'; __file__='"'"'/tmp/pip-install-s6nahssd/scipy/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' clean --all
cwd: /tmp/pip-install-s6nahssd/scipy
Complete output (9 lines):
`setup.py clean` is not supported, use one of the following instead:
- `git clean -xdf` (cleans all files)
- `git clean -Xdf` (cleans all versioned files, doesn't touch
files that aren't checked into the git repo)
Add `--force` to your command to use it anyway if you must (unsupported).
----------------------------------------
ERROR: Failed cleaning build dir for scipy
Successfully built numpy
Failed to build scipy
ERROR: Could not build wheels for scipy which use PEP 517 and cannot be installed directly
从错误看来,构建过程使用的是python3.6
,而我使用的是FROM alpine:3.7
。
完整日志在这里 -> https://pastebin.com/Tw4ubxSA
这是当前的 Dockerfile:
https://pastebin.com/3SftEufx
【问题讨论】:
您提到“指定pandas<0.21.0
,因为据称更高版本与numpy
冲突”,您是否真的遇到过pandas 0.24.1
和numpy
之间的问题?自发布以来,我每天都在使用此版本,并且我没有遇到与numpy
的任何冲突问题。
在上面的上下文中,如果我指向Collecting pandas==0.24.1
,我会得到错误:File "/usr/lib/python3.6/site-packages/pkg_resources/__init__.py", line 346, in get_provider module = sys.modules[moduleOrReq] KeyError: 'numpy'
嗯.. 你有没有试过把你的库放在requirements.txt
文件中,COPY
文件到你的容器和RUN pip install -r requirements
。这就是我通常在我的 docker 项目中安装 python 库的方式
试过了,没用。请参考我的编辑。
为什么要自己构建?你可以在Dockerhub
上找到大量已经在工作的用于数据科学应用程序的容器,例如 Anaconda 容器就足够了。我认为即使nltk
默认情况下也在那里,所以你可以使用这样的“交钥匙”容器。
【参考方案1】:
Why does it take ages to install Pandas on Alpine Linux 上的较早问答相关。
如果您的目标是在不了解具体细节的情况下获得稳定的解决方案,对于 python 3,您可以构建以下内容(复制并粘贴我来自 https://***.com/a/50443531/1021819 的答案)
FROM python:3.7-alpine
RUN echo "@testing http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
RUN apk add --update --no-cache py3-numpy py3-pandas@testing
如果您的目标是了解如何以实现稳定的构建,那么那里的讨论和相关图片可能也会有所帮助...
【讨论】:
【参考方案2】:这可能并不完全相关,因为这是在 Alpine 中搜索 numpy/pandas 安装失败时弹出的第一个答案,我正在添加这个答案。
以下修复对我有用(但安装 pandas/numpy 需要更长的时间)
apk update
apk --no-cache add curl gcc g++
ln -s /usr/include/locale.h /usr/include/xlocale.h
现在尝试安装 pandas/numpy
【讨论】:
【参考方案3】:如果您未绑定到 Alpine 3.6,则使用 Alpine 3.7(或更高版本)应该可以工作。
在 Alpine 3.6 上,我安装 matplotlib
失败,原因如下:
Collecting matplotlib
Downloading https://files.pythonhosted.org/packages/26/04/8b381d5b166508cc258632b225adbafec49bbe69aa9a4fa1f1b461428313/matplotlib-3.0.3.tar.gz (36.6MB)
Complete output from command python setup.py egg_info:
Download error on https://pypi.org/simple/numpy/: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833) -- Some packages may not be found!
Couldn't find index page for 'numpy' (maybe misspelled?)
Download error on https://pypi.org/simple/: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833) -- Some packages may not be found!
No local packages or working download links found for numpy>=1.10.0
但是,在 Alpine 3.7 上,它起作用了。这可能是由于numpy
版本控制问题(请参阅here),但我无法确定。解决了这个问题,成功构建并安装了包 - 花了很长时间,大约 30 分钟(由于 Alpine 的 musl-libc 与 Python 的 Wheels 格式不兼容,所有使用 pip 安装的包都必须从源代码构建)。
请注意,需要进行一项重要更改:您应该只删除 pip install
之后的 build-runtime
虚拟包 (apk del build-runtime
)。此外,如果适用,您可以将 numpy 1.16.1
替换为 1.16.2
,这是随附的版本(否则将卸载 1.16.2
并从源代码构建 1.16.1
,进一步增加构建时间) - 我没试过不过这个。
作为参考,这里是我稍作修改的Dockerfile 和docker build output。
注意:
通常选择 Alpine 作为最小化图像大小的基础(Alpine 在其他方面也非常流畅,但由于 glibc/musl 存在与大陆 Linux 应用程序的兼容性问题)。必须从源代码构建 Python 包比达到这个目的,因为你会得到一个非常臃肿的图像 - 900MB 在任何清理之前,这也需要很长时间才能构建。通过删除所有中间编译工件、构建依赖项等,可以大大压缩图像,但仍然如此。
如果您无法获得在 Alpine 上工作所需的 Python 包版本,而无需从源代码构建它们,我建议您尝试其他小型且更兼容的基础映像,例如 debian-slim
,甚至 ubuntu
.
编辑:
在添加了要求的“编辑 3”之后,这里更新了 Dockerfile 和 Docker build output。 添加了以下软件包以满足构建依赖项:
postgresql-dev libffi-dev libressl-dev libxml2 libxml2-dev libxslt libxslt-dev libjpeg-turbo-dev zlib-dev
对于由于特定标头而无法构建的包,我使用 Alpine 的包内容搜索来定位丢失的包。
专门针对cffi
,缺少ffi.h
标头,需要libffi-dev
包:https://pkgs.alpinelinux.org/contents?file=ffi.h&path=&name=&branch=v3.7。
或者,当包构建失败不是很清楚时,可以参考具体包的安装说明,例如Pillow。
压缩前的新映像大小为 1.04GB。为了减少一点,您可以删除 Python 和 pip 缓存:
RUN apk del build-runtime && \
find -type d -name __pycache__ -prune -exec rm -rf \; && \
rm -rf ~/.cache/pip
当使用docker build --squash
时,这会将图像大小降低到 661MB。
【讨论】:
当它到达pip install requirements.txt
时,我仍然会崩溃。 (确切地说是Collecting pycparser (from cffi>=1.1)
,如果您希望使用完整版本进行测试,我将使用我的requirements.txt
的粘贴箱编辑问题。
@data_garden 添加了更新的 Dockerfile - 请查看我的更新答案
这很有效,非常感谢您的努力和清晰。 +1
@data_garden 很棒,很高兴。另请参阅我最近的编辑,以稍微减小图像大小。干杯!
解决方案不再起作用。请参考我的编辑。【参考方案4】:
尝试将此添加到您的 requirements.txt 文件中:
numpy==1.16.0
pandas==0.23.4
从昨天开始我就遇到了同样的错误,这次更改为我解决了这个问题。
【讨论】:
是的。这是我的基础镜像:FROM openjdk:8-alpine 也许你可以试试FROM alpine:3.6
,添加上面的其他数据包,看看它是否仍然在你的环境中工作..以上是关于在 docker Alpine 中安装 pandas的主要内容,如果未能解决你的问题,请参考以下文章
在 Alpine Linux Docker 容器中安装 ODBC 驱动程序
如何在 Alpine linux docker 镜像中安装 oracle jdk11?
在 alpine docker 容器中安装 psycopg2
为啥在 Alpine Linux 上安装 Pandas 需要很长时间
如何在 Alpine Linux Docker Container 中安装“Microsoft Access Driver (*.mdb, *.accdb)”驱动程序