Docker python无法导入通过apt-get安装的模块

Posted

技术标签:

【中文标题】Docker python无法导入通过apt-get安装的模块【英文标题】:Docker python unable to import module installed via apt-get 【发布时间】:2020-10-27 00:02:48 【问题描述】:

我正在尝试通过 docker 构建一个 python 应用程序,但是即使我已经通过 apt 安装了适当的包,它也无法导入 numpy。作为 dockerfile 的示例,这里只简化为重要的:

FROM python:3

RUN apt-get update \
    && apt-get install python3-numpy -y
RUN python3 -c "import numpy; print(numpy.__version__)"

尝试构建该 dockerfile 会导致错误 ModuleNotFoundError: No module named 'numpy'

如果我使用 pip 安装 numpy,我可以让它工作,但我希望它可以与 apt-get 包一起工作。为什么这不符合我的预期?

【问题讨论】:

【参考方案1】:

问题是你安装了两个 Python:

    图片在/usr/local/bin中带有python。 当你安装 python3-numpy 时,从 Debian 安装 python3 包,最后是 /usr/bin/python

当您最后运行代码时,您可能使用的是/usr/local/bin 中的版本,但为/usr/bin 中的版本安装了 NumPy。

解决方案:使用pip 安装 NumPy,例如pip install numpy,而不是使用 apt。

长版,通过其他方式可能会导致导入错误:https://pythonspeed.com/articles/importerror-docker/

【讨论】:

查看/usr/local/lib 实际上看起来有3个版本附带图像(2.7、3.7和3.8)。运行which python3 确实表明它正在使用二进制文件/usr/local/bin/python3,它是python3.8 的符号链接。为什么它不能导入 NumPy 模块对我来说仍然没有意义?似乎所有建议都指向使用 pip 安装依赖项,而不是从 apt 安装包 - 如果是这样,为什么 apt 甚至有这些包? 另一种解决方案是使用包存储库中的 python 和 debian 基础映像。 问题是基础镜像是 Debian + 它自己的 Python。因此,从 Debian 的角度来看,拥有自己的 NumPy 是有意义的,这样您就可以安装依赖它的 Debian 软件包。从 Docker 镜像的角度来看,这没有任何意义。【参考方案2】:

问题在于 python 环境,而不是 docker。 apt-get安装的numpy和python安装不在同一个环境。此外,依赖项应存储在requirements.txt 文件中,然后应通过 pip 安装。 python -m pip可以用来保证pip命令和python安装在同一个环境。

【讨论】:

以上是关于Docker python无法导入通过apt-get安装的模块的主要内容,如果未能解决你的问题,请参考以下文章

Python 无法通过 Docker 连接到 Cassandra

Docker笔记——Docker安装及制作镜像

vulfocus无法导入镜像

为啥客户的python包无法导入?

无法在 macOS 上为 Python 3.6 导入 pdftotext

Ubuntu 16.04安装Docker步骤