使用Docker运行Wagtail站点时出现ERR_EMPTY_RESPONSE的问题
我之前迁移Django/Wagtail到Docker时也踩过这个一模一样的坑,咱们一步步拆解问题,应该能快速定位:
1. 先确认容器内的Wagtail服务真的在监听正确端口
端口映射看起来没问题,但服务可能没绑定到容器的所有网卡(只绑127.0.0.1的话,外部根本访问不到)。
进入容器检查端口监听状态:
docker exec -it <你的容器ID/名称> ss -tulpn | grep 8080正常应该看到类似
LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("python",pid=xxx,fd=xxx))的输出。如果显示的是127.0.0.1:8080,那问题就出在这——你需要修改启动命令,让Wagtail绑定到0.0.0.0。检查你的
start-app.sh或者启动命令,确保是:python manage.py runserver 0.0.0.0:8080而不是只绑定
127.0.0.1:8080。
2. 查看容器日志,排查服务启动失败原因
很多时候服务根本没起来,自然没响应。运行以下命令看日志:
docker logs <你的容器ID/名称>
重点关注这些报错点:
- 依赖包是否没安装全?比如Dockerfile里有没有执行
pip install -r requirements.txt? - 数据库连接是否失败?比如
dev.py里的数据库配置是不是和Docker环境不匹配? - 启动脚本有没有执行权限?Dockerfile里有没有加
RUN chmod +x /entrypoint.sh /start-app.sh?
3. 检查主机端口是否被占用
虽然docker ps显示端口映射成功,但主机的8080端口可能被其他进程占用了。在主机上运行:
netstat -tulpn | grep 8080
如果能看到其他进程占用8080,要么杀掉那个进程,要么换个端口启动容器:
docker run -p 8081:8080 app:latest
然后访问0.0.0.0:8081试试。
4. 确认Wagtail的ALLOWED_HOSTS配置
虽然ERR_EMPTY_RESPONSE通常不是这个问题,但也可以快速排除:打开dev.py,确保ALLOWED_HOSTS包含你访问的IP,或者开发环境直接设为允许所有:
ALLOWED_HOSTS = ['*']
注意:生产环境别这么配置,仅用于开发调试。
5. 检查Docker Compose网络配置(如果用了docker-compose)
如果是用docker-compose启动的,检查docker-compose.yml里的ports配置是否正确:
services: app: build: . ports: - "8080:8080" # 左边是主机端口,右边是容器端口,别写反了! # 其他配置...
另外,别随便添加network_mode: host这类配置,除非你明确知道用途,否则可能干扰端口映射逻辑。
按这个流程排查,一般都能找到问题——我当时就是启动脚本里误绑了127.0.0.1,改完就正常访问了。
内容的提问来源于stack exchange,提问作者kbdev

