PluginInvokeError报错且日志出现getaddrinfo failed或Name or service not known,说明容器DNS解析失败,根因是Docker默认DNS(127.0.0.11)在复杂网络下失效,需手动配置可靠DNS服务器、调整dns_opt或使用extra_hosts硬编码映射来修复解析链路。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

当Dify插件调用失败并报PluginInvokeError,且日志中出现getaddrinfo failed或Name or service not known时,说明容器内无法解析目标域名——这通常不是插件本身的问题,而是Docker默认DNS(127.0.0.11)在复杂组网下失效,必须手动指定可靠DNS服务器才能打通插件调用链路。
确认当前容器DNS是否异常
进入正在运行的plugin_daemon容器执行解析测试:docker exec -it plugin_daemon nslookup api。若返回server can't find api: NXDOMAIN或超时,说明DNS未正确识别Docker内部服务名;若能解析出172.x.x.x网段地址,但调用外部API仍失败,则问题出在对外域名解析环节。
再测试公网域名:docker exec -it plugin_daemon nslookup google.com。如果这一步也失败,基本可断定容器DNS配置被覆盖或不可达,需立即干预。
通过docker-compose.yml全局指定DNS
方法一:在docker-compose.yml顶层添加dns配置项,作用于所有服务:
```yaml
version: '3.8'
services:
plugin_daemon:
image: difyai/plugin-daemon
dns:
- 8.8.8.8
- 114.114.114.114
```
⚠️ 注意:该配置仅对bridge网络有效;若使用自定义网络(如dify-network),必须同时在network定义中显式启用internal: false,否则dns字段会被忽略。
方法二:为plugin_daemon单独强化DNS,并禁用Docker内置DNS缓存:
```yaml
plugin_daemon:
dns:
- 8.8.8.8
dns_opt:
- ndots:1
- timeout:1
dns_search:
- dify.local
```
其中ndots:1强制单标签域名(如api)也走DNS查询而非直接拼接search域,避免因短域名跳过解析。
修改宿主机Docker守护进程配置
第一步:编辑Docker守护进程配置文件/etc/docker/daemon.json(Linux)或Docker Desktop设置中的Daemon JSON(macOS/Windows)。
第二步:添加以下内容(若文件不存在则新建):
```json
{
"dns": ["223.5.5.5", "119.29.29.29"],
"dns-search": ["dify.svc.cluster.local"]
}
```
【必须重启Docker服务才能生效】执行sudo systemctl restart docker(Linux)或在Docker Desktop界面点击“Apply & Restart”。
第三步:验证新配置是否载入:docker info | grep -i dns。输出中应包含你刚写入的DNS地址,且无WARNING: No swap limit support类干扰信息——该警告不影响DNS,可忽略。
临时绕过DNS故障:用extra_hosts硬编码映射
当网络策略严格禁止容器访问外部DNS,或仅需解析少数几个固定域名时,此法最稳妥。
在plugin_daemon服务定义中加入:
```yaml
plugin_daemon:
extra_hosts:
- "api.dify.local:172.20.0.3"
- "ollama-server:192.168.1.105"
```
IP地址必须是目标服务在Docker网络中的实际分配地址,可通过docker network inspect dify-network | grep IPv4Address查得。填错会导致连接被定向到错误机器,【务必核对IP与服务名对应关系】。
该配置会直接写入容器内/etc/hosts,优先级高于DNS查询,无需重启容器即可生效(下次启动时自动加载)。











