Docker化Django项目部署Heroku出现Application错误如何解决
问题原因
heroku.yml的启动命令配置完全错误:你当前配置的run.web是Ruby项目的Puma服务启动命令,和你的Python Django项目完全不匹配,是触发解析报错的核心原因。- Dockerfile存在多处错误:
- 缺失基础镜像声明,镜像构建无法正常启动
- 依赖文件名拼写错误,把
requirements.txt写为requiremenrs.txt,会导致依赖安装失败 - 构建阶段执行
migrate操作:镜像构建时没有数据库访问权限,迁移操作应该放在服务启动阶段执行 - 硬编码监听端口为8000:Heroku会动态分配端口,要求Web服务必须监听平台提供的
$PORT环境变量,硬编码会导致服务无法被外部访问
- docker-compose.yml是本地开发用的配置,和Heroku部署无关,不需要改动。
解决方案
1. 修正Dockerfile
# 声明Python基础镜像,可根据你的项目需求更换版本 FROM python:3.10-slim RUN mkdir /code WORKDIR /code ADD . /code/ RUN python -m pip install --upgrade pip # 修正依赖文件拼写错误 RUN pip3 install -r requirements.txt # 启动命令集成迁移操作,使用Heroku分配的PORT变量 CMD sh -c "python manage.py migrate && python manage.py runserver 0.0.0.0:$PORT"
2. 修正heroku.yml
直接删除错误的run配置即可,Dockerfile中已经声明了正确的启动命令,修正后的内容如下:
build: docker: web: Dockerfile
如果要把启动命令统一放在heroku.yml中管理,也可以写成如下形式:
build: docker: web: Dockerfile run: web: sh -c "python manage.py migrate && python manage.py runserver 0.0.0.0:$PORT"
3. 重新执行部署命令
heroku container:login heroku container:push web heroku container:release web
生产环境优化建议
Django自带的runserver仅适用于开发调试,生产环境建议替换为gunicorn:
- 在
requirements.txt中添加gunicorn依赖 - 将启动命令替换为:
gunicorn 你的项目名.wsgi --bind 0.0.0.0:$PORT - 提前配置好Heroku环境变量中的
SECRET_KEY、数据库连接等必要配置。
内容的提问来源于stack exchange,提问作者Niloofar
相关产品推荐
相关产品推荐

