我在docker容器中访问我的应用程序时遇到问题。基本上我想通过容器内的pip安装它,并运行主脚本将此包作为依赖项导入
以下是Dockerfile的主要功能:
FROM ubuntu
COPY WasteClassifier /opt/WasteClassifier
RUN apt update && apt-get -y install sudo && sudo apt-get install -y python3 python3-pip
RUN export PYTHONPATH="/usr/local/lib/python3.10/dist-packages"
RUN python3 -m pip install --target="/usr/lib/python3.10/dist-packages" /opt/WasteClassifier
RUN python3 -c 'import WasteClassifier'
当从应用程序运行主脚本时,我收到导入错误:
ModuleNotFoundError: No module named 'WasteClassifier'
做了额外的步骤来打印所有的可导入项,其中列出了我的应用程序,虽然我不能在同一步骤中导入它,here is screenshot of it。它也列在pip库中,pip list screenshot
应用程序在ubuntu上的容器外正常工作。
这里可能有什么问题?它更像是python或docker问题,我应该在哪里查找?
先谢了
我试过导出路径,更改安装路径,在python中更改sys路径,安装不同的pip(apt-get install pip / apt-get install python-pip),在镜像中使用不同的python和ubuntu版本,这些都不起作用。
1条答案
按热度按时间kknvjkwl1#
在我看来,Dockerfile的最后三行相当于更简单的一行:
如果这样也不行(我不相信它会)那么这是因为
pip
安装了一个名为WasteClassifier
的 * 包 *,但该包不包含名为WasteClassifier
的 * 模块 *。pip分发包与模块不一样,即使它具有相同的名称。所以这是一个打包问题,并且取决于WasteClassifier
目录的内容(如@yong所暗示的)。如果它看起来在Docker之外工作,那么这可能是因为在您的开发环境中有其他东西定义了
WasteClassifier
模块-它可以像直接在您的模块路径中拥有源代码一样简单。Docker在揭示隐藏的环境依赖性方面非常有用。事实证明,这并不相关,但值得指出,以防以后它会为您节省痛苦:
如果问题确实需要设置
PYTHONPATH
(或任何其他环境变量),那么下面的公式就没有用了:因为每个
RUN
命令都在一个单独的shell中执行,第一个命令的环境对第二个命令是不可见的,所以需要使用以下常用习惯用法将它们组合成一个命令:无论如何,这可能是一件好事,因为每个额外的
RUN
命令都会为您的图像添加一个额外的层,这使得加载成本更高。