问题描述
在使用 Dify 图形界面创建工作流时,HTTP 请求节点访问知识库接口时报错:
- 使用
localhost
访问接口 → 报错Reached maximum retries (0)
或 400/404。 - 使用宿主机 IP(如
192.168.0.1
) → 报错 400。 - 使用
host.docker.internal
→ 报错 404。
而用 APIFox 或浏览器直接访问 http://localhost/v1/datasets/...
时可以正常访问。
原因分析
-
Dify Web / Workflow 运行在 Docker 容器中
- 你的 Dify workflow 节点实际上是在 Docker 容器里运行的,而不是直接在宿主机上。
- 在容器内部,
localhost
指的是容器自身,而不是宿主机,所以访问localhost
会失败。
-
容器内部访问宿主机端口不总是通畅
- Windows 或 macOS 上,可以通过
host.docker.internal
访问宿主机。 - 但 Dify API 的端口映射和内部路由可能导致直接用
host.docker.internal
访问失败(404),或者容器网络找不到该路径。
- Windows 或 macOS 上,可以通过
-
正确的容器内部通信方式
- Docker 容器内部有一个 自建网络 ,同一网络下的容器可以通过 容器名称 + 容器内部端口 相互访问。
- 例如:你的 API 容器名称为
docker-api-1
,监听端口 5001 → 可以在另一个容器中访问http://docker-api-1:5001/...
。
解决方案
-
在 Workflow HTTP 节点中使用容器内部地址
texthttp://docker-api-1:5001/v1/datasets/<dataset-id>/document/create-by-text
docker-api-1
:API 容器名称5001
:容器内部监听端口<dataset-id>
:你创建的知识库 ID
-
不要用
localhost
或宿主机 IPlocalhost
→ 指向容器自己- 宿主机 IP /
host.docker.internal
→ 可能被代理或端口映射拦截
-
确认容器网络连接正常
-
可以在 workflow 容器中执行 ping 或 curl 测试:
bashcurl http://docker-api-1:5001/v1/datasets/<dataset-id>/document/create-by-text
-
-
端口映射仅用于外部访问
- 映射到宿主机(如 5001:5001)是为了 APIFox 或浏览器访问。
- 容器内部通信优先用容器名和内部端口。
结论
- HTTP 节点报错 400/404 的根本原因 :Docker 容器内部访问路径错误,容器里的
localhost
不等于宿主机的localhost
。 - 正确做法 :使用容器内部网络访问,即用 API 容器名称 + 内部端口。