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