通过Docker部署到Heroku的Web应用无法访问,报错H10如何解决?
问题修复方案
Heroku返回H10错误说明你的Web进程启动后直接崩溃,没有成功监听平台分配的端口,可按以下步骤排查修复:
1. 修正CMD指令确保环境变量正确解析
你当前Dockerfile的CMD为shell形式,exec形式下无法直接解析变量,且需要通过bash加载运行时注入的PORT变量,将CMD修改为:
CMD ["bash", "-c", "uvicorn main:app --host 0.0.0.0 --port ${PORT} --log-level trace --use-colors"]
该写法会触发bash解析${PORT}变量,正确读取Heroku动态分配的端口。
2. 修正代码拷贝路径错误
从Dockerfile的ADD ./webapp/requirements.txt /tmp/requirements.txt可知,你本地项目的应用代码存放在根目录下的webapp子文件夹中,但你后续的ADD ./ /webapp/会将整个项目根目录(包含webapp子文件夹)拷贝到镜像内的/webapp路径下,最终你的main.py实际路径为/webapp/webapp/main.py,uvicorn启动时找不到对应文件直接崩溃。
可修改代码拷贝逻辑:
# 把原有的ADD ./ /webapp/替换为下面这条,只拷贝应用代码到工作目录 ADD ./webapp /webapp/
3. 本地贴近Heroku环境验证
修改完成后不要用docker-compose固定端口测试,直接用docker命令模拟Heroku的运行逻辑,确认应用可正常启动:
docker build -t test-heroku-app . docker run -e PORT=8000 -p 8000:8000 test-heroku-app
访问本地127.0.0.1:8000确认返回正常内容后再重新部署到Heroku即可。
4. 可选:查看详细启动日志
如果修改后仍报错,可通过Heroku CLI查看进程的详细启动日志定位问题:
heroku logs --dyno web --tail
内容的提问来源于stack exchange,提问作者Takehiko Esaka
相关产品推荐
相关产品推荐

