Docker中的Python模块:ModuleNotFoundError:没有名为“ src”的模块

时间:2020-10-16 06:55:52

标签: python docker

我知道这是一个普遍的问题,但是在网上搜索了大约一个小时之后,还没有解决方案。该代码在本地工作,但在Docker中出现此错误:

ModuleNotFoundError:没有名为“ src”的模块

无论我如何构造代码,这都使我发疯了b / c,我遇到了这个错误或找不到路径错误,但是无论哪种方式,我所做的事情都只是图表而已/

简而言之,我正在为一个不稳定的网关构建一个dockerized监视器,每隔几分钟测试一次网关主机是否仍可访问并且网关本身仍在工作。该网关。

文件夹结构很简单:

 monitor
    - src 
       - api
       - __init__
       EmailManager.py
       GatewayManager.py
   CONTACT.py # contains email addresses
   main.py  

init 模块如下所示:

from src.api.EmailManager import EmailManager
from src.api.GatewayManager import GatewayManager 

这两个类中的每一个都遵循相当标准的模式。以EmailManager为例:


class EmailManager(object):
    def __init__(self, default_address):
    
    def send_email()...

就我而言,这没什么特别的。 main.py包含MainClass和要运行的简单main函数。

from src.api.EmailManager import EmailManager
from src.api.GatewayManager import GatewayManager
from src.CONTACT import ADMIN_EMAIL

class MainClass:

    def __init__(self):
        self.em = EmailManager(default_address=ADMIN_EMAIL)
        .... 
    
if __name__ == '__main__':
    mc = MainClass()

    def signal_handler(sig, frame):
        print('Handle signal {signal}'.format(signal=sig))
        mc.shutdown()

    print("Register SIGTERM event handler")
    signal.signal(signal.SIGTERM, signal_handler)

    print("Start gateway monitor")
    mc.run(minutes=1)

这在我的工作站上可以很好地工作,并且大致可以完成预期的工作。匹配的Dockerfile也非常简单:

FROM python:3.8-slim-buster

COPY config/requirements.txt .
COPY src /src

CMD 'python -m pip install --upgrade pip'

RUN pip install -r requirements.txt

CMD [ "python", "./src/main.py" ]

有人抛出ModuleNotFound错误。

将最后一行更改为

CMD [“ python”,“ -m”,“ ./src/main.py”]

我收到以下错误:

/ usr / local / bin / python:不支持相对模块名称

有什么主意如何构造这些类,以便它们在Docker中正常运行?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

树形结构有点令人困惑,但是在取消导入之后,您的文件夹结构应如下所示:

/absoloute_path/models/dtree

从那里,您的├── main.py └── src ├── CONTACT.py ├── __init__.py └── api ├── EmailManager.py ├── GatewayManager.py └── __init__.py 看起来像这样(如您所愿):

main.py