使用Poetry构建Dockerfile时遭遇ModuleNotFoundError问题求助
解决ModuleNotFoundError: No module named 'geocoding'问题
错误原因
- 模块搜索路径差异:PyCharm会自动将项目根目录(包含
backend_services、pyproject.toml的目录)添加到Python的模块搜索路径sys.path中,因此能识别geocoding模块;但终端和Docker容器中,默认sys.path不包含该根目录,导致Python找不到模块。 - Dockerfile复制路径错误:你的
geocoding目录实际位于backend_services下,但Dockerfile中使用COPY geocoding /app/geocoding,构建时会找不到源文件(构建上下文是项目根目录,根目录下没有直接的geocoding目录)。即使文件被错误复制到容器中,直接运行脚本文件时,Python只会将脚本所在目录加入sys.path,而非/app,依旧无法识别geocoding模块。
解决方案
方案一:使用模块方式启动脚本
将Dockerfile中的启动命令改为模块启动模式,这种方式会自动将当前工作目录(/app)加入sys.path:
CMD ["python", "-m", "geocoding.infrastructure.rest_api.app"]
方案二:修正Dockerfile复制逻辑+模块启动
调整Dockerfile中复制geocoding目录的路径,确保文件被正确复制到容器中,同时用模块方式启动:
FROM python:3.11 WORKDIR /app # 复制依赖配置文件 COPY pyproject.toml poetry.lock ./ RUN pip3 install poetry \ && poetry config virtualenvs.create false \ && poetry install --no-interaction # 从正确路径复制geocoding目录 COPY backend_services/geocoding ./geocoding EXPOSE 5000 # 模块方式启动应用 CMD ["python", "-m", "geocoding.infrastructure.rest_api.app"]
方案三:手动添加模块路径(不推荐)
在app.py的最顶部添加代码,手动将项目根目录加入sys.path:
import sys from pathlib import Path # 将/app目录添加到模块搜索路径 sys.path.append(str(Path(__file__).resolve().parent.parent.parent.parent))
内容的提问来源于stack exchange,提问作者PepeLoperena
相关产品推荐
相关产品推荐

