Docker部署的Hasura调用宿主机NodeJS Action报handler不存在错误
问题根源
host.docker.internal 是Docker Desktop(Windows/macOS版本)默认提供的宿主机域名解析,Linux系统下的Docker CE默认不支持该域名,所以容器内无法解析到宿主机地址。另外你在服务器上尝试的localhost/127.0.0.1指向的是Hasura容器自身的网络,不是宿主机,所以也无法访问到跑在宿主机上的NodeJS服务。从报错日志也能看到,Hasura实际还在请求host.docker.internal地址,说明你修改的Action URL配置未实际生效。
解决步骤
1. 确认NodeJS服务监听配置
确保你的Express服务监听的是0.0.0.0:5000,而不是127.0.0.1:5000,否则只有宿主机本地能访问,Docker容器无法请求到:
app.listen(5000, '0.0.0.0', () => { console.log('服务运行在0.0.0.0:5000') })
2. 配置宿主机地址访问
可选两种方案,二选一即可:
方案1:统一使用host.docker.internal域名(本地/服务器配置不用改)
启动Hasura容器时手动添加宿主机域名映射:
- 若用
docker run启动,添加参数:--add-host=host.docker.internal:172.17.0.1 - 若用
docker-compose启动,在Hasura服务配置下添加:services: hasura: # 其余原有配置保留 extra_hosts: - "host.docker.internal:172.17.0.1"
注:如果你的Docker使用自定义桥接网络,可执行docker network inspect <网络名称>查看Gateway字段,替换上方的172.17.0.1为实际的网关IP。
方案2:直接修改Action基础URL
将Hasura Action的基础URL改为http://172.17.0.1:5000/api,172.17.0.1是Docker默认桥接网络下的宿主机IP,容器内可直接访问。
3. 验证配置生效
- 确认Hasura控制台/环境变量中Action的URL已更新为新地址,不再使用
host.docker.internal - 进入Hasura容器测试连通性:
正常返回接口响应则说明连通正常。docker exec -it <你的Hasura容器ID/名称> curl http://172.17.0.1:5000/api
内容的提问来源于stack exchange,提问作者Borisa Krstic
相关产品推荐
相关产品推荐

