Docker部署Django+Daphne应用时出现ModuleNotFoundError: No module named 'project'错误
看起来你在Docker环境下部署Django+Daphne应用时遇到了模块找不到的问题,我仔细看了你的配置和目录结构,大概率是路径配置不匹配导致的,下面一步步帮你排查和解决:
核心问题分析
从你的目录结构来看,本地项目的层级是:drf-vue3-gym-managament/backend/project/,其中backend/project下有manage.py,里面还有一个子目录project(包含asgi.py和settings.py)。结合Docker配置和错误日志,主要存在两个关键问题:
- Docker构建上下文与目录结构不匹配,导致容器内的文件路径混乱;
PYTHONPATH设置依赖当前工作目录,没有明确指向能找到Django模块的路径。
具体修复方案
1. 修正Docker Compose的构建上下文
如果你的docker-compose.yml放在项目根目录drf-vue3-gym-managament下,而Dockerfile在backend目录里,当前的build.context: .会把整个根目录(包括backend、frontend)复制到容器的/backend/目录下,导致容器内的路径变成/backend/backend/project/...,完全偏离预期。
修改docker-compose.yml中的web服务构建配置:
services: web: build: context: ./backend # 改为指向backend目录 dockerfile: Dockerfile # 注意文件名大小写,和本地文件保持一致
这样构建时会以backend目录为上下文,COPY . /backend/会把本地backend下的所有内容复制到容器的/backend/,容器内的路径就会和你预期的一致:/backend/project/manage.py。
2. 明确设置PYTHONPATH
原来的PYTHONPATH="."依赖当前工作目录,容易出问题。直接在Dockerfile中固定PYTHONPATH为manage.py所在的目录:
# 替换原来的ENV PYTHONPATH="." ENV PYTHONPATH="/backend/project"
这样Python会直接在/backend/project目录下查找project模块(也就是里面的子目录project,包含asgi.py),确保能正确导入。
3. 验证容器内路径(可选)
如果修改后还是有问题,可以进入容器检查路径是否正确:
docker exec -it c_django ls /backend
正常情况下应该能看到project目录,进入该目录后能看到manage.py和子目录project。
4. 确认Daphne命令和环境变量
保持DJANGO_SETTINGS_MODULE=project.settings的设置(因为容器内/backend/project/project/settings.py是正确的路径),Daphne的命令不需要修改,只要路径正确就能找到project.asgi:application。
总结
先调整Docker Compose的构建上下文,确保容器内的文件路径和本地一致,再固定PYTHONPATH,这两个步骤应该能解决模块找不到的问题。如果还有疑问,可以临时把Daphne命令换成python manage.py runserver测试,看是否能正常启动,排查是不是Daphne的特殊问题。
备注:内容来源于stack exchange,提问作者whisber




