Docker启动Django报froala_editor模块不存在但功能正常问题咨询
froala_editor模块找不到报错排查 报错信息:ModuleNotFoundError: No module named 'froala_editor'
问题场景
在Docker容器中运行Django v2.2.6版本时,手动进入容器执行pip install django-froala-editor完成依赖安装,执行pip freeze可确认django-froala-editor已安装成功。随后将froala_editor添加到项目INSTALLED_APPS配置中,配置代码如下:
INSTALLED_APPS = [ ...., 'froala_editor', ]
配置完成后在模型文件中引入FroalaField字段使用,相关代码如下:
from froala_editor.fields import FroalaField class BlogPost(models.Model): title = models.CharField(max_length=200) blurb = FroalaField()
当前项目功能运行完全正常,但每次执行docker compose up启动容器时都会抛出上述模块找不到的错误,容器配置了数据卷挂载。
报错根本原因
- 手动进入运行态容器执行pip安装的依赖仅保存在当前容器的临时可写层,不会持久化到镜像中。
docker compose up过程中如果触发容器重建(比如容器被删除、镜像重新构建、compose配置变更),之前手动安装的包会被完全清除。 - 数据卷挂载配置存在路径覆盖问题:如果compose中配置的卷挂载路径包含容器内Python第三方包的安装目录(site-packages),宿主机本地目录的文件会直接覆盖容器内预装的依赖,导致启动瞬间Django扫描
INSTALLED_APPS时找不到对应模块。手动进入容器重新安装后功能恢复正常,刚好对应启动阶段容器内缺失依赖的特征。
修复方案
- 停止手动进入运行态容器安装依赖的操作,将
django-froala-editor写入项目根目录的requirements.txt依赖清单,在Dockerfile构建阶段执行pip install -r requirements.txt,将依赖直接固化到镜像层,保证每次容器启动时环境内已预装所有所需包。 - 检查
docker-compose.yml中的volumes配置项,调整挂载路径范围,禁止将容器内的Python依赖安装目录纳入宿主机挂载覆盖范围。 - 检查容器启动入口脚本(entrypoint.sh)的执行顺序,确保所有Django相关指令(
migrate、collectstatic、runserver)都在依赖安装步骤完成后再执行,避免提前加载模块触发报错。
内容的提问来源于stack exchange,提问作者Yusuf
相关产品推荐
相关产品推荐

