Dify 知识库引擎迁移Milvus(踩坑记录)

Dify 知识库引擎迁移Milvus(踩坑记录)

fanz Lv3

更换起因:今天早上师兄看到服务器上 weaviate 一直占用着大量的 cpu 资源,但是也不清楚它到底在干什么,正好上次探索 RAG 之后项目开始使用 milvus 了,师兄就说要不直接也把 dify 换成 milvus 好了。

查看了一下官方文档:Dify:迁移 Weaviate 向量数据到其他向量数据库,发现步骤并不复杂,其实就是更新一下.env 文件还有 docker-compose.yml 文件就可以了。

image.png

顺着这个文档,我修改了.env 文件里的内容,并且使用 docker compose 重启了 dify,但是在执行命令docker exec -it docker-api-1 flask vdb-migrate的时候报错了:

image.png

不是什么大问题,只是说连不上本机上的 milvus 了(milvus 的端口号默认为 19530)。在 C 站看到一篇博客【Dify】向量数据库迁移至 Milvus 踩坑记录,这篇博客是说可能是 milvus 的 docker 容器没有开放端口,我检查了一下是没有错误的;这篇博客还提到一个解决方案,就是在 dify-api 的 compose-config 中增加如下两行:

image.png

不过我加上这两行之后还是没用,看了一下这篇博客的时间是 24 年 9 月,应该是老版本的 dify,而我使用的是 0.15.3 版本的,所以这个做法应该是行不通的。不过这个解决方案倒是引出了一个问题:

Tip

MILVUS_HOSTMILVUS_PORT 在环境变量中都已经定义好了,为什么不直接在环境变量修改?还有这里的 Host 为什么不直接填 127.0.0.1,而是填 milvus-standalone

解决方案

感谢 Github 上大佬的解决办法: <MilvusException: (code=2, message=Fail connecting to server on 127.0.0.1:19530, illegal connection params or server unavailable)>

其实只需要修改 docker-compose 文件,给 milvus-standalone 增加如下两个网络,并且修改.env 文件中的 MILVUS_URL 就可以了。
image.png
image.png

原因分析

发生不能连接 milvus 错误的主要原因是因为docker exec -it docker-api-1 flask vdb-migrate这句命令是指在正在运行的容器 docker-api-1 容器中执行 flask vdb-migrate 命令,那么会导致 127.0.0.1 变成了容器自身的 IP 而不是宿主机的 IP。

而帖子中这种做法则是通过修改设置,将 docker-api 和 milvus-standalone 连接在同一个网络下(docker-api 默认设置了 ssrf_proxy_network、default 网络),这样容器间通信时可以将容器名作为域名进行访问。比如这里 milvus-standalone 会被自动解析成容器的 IP 地址。

Note

还有一种做法是可以将 127.0.0.1 改成宿主机通用 DNS host.docker.internal,这样访问到的就是宿主机上的 19530 端口。

  • 标题: Dify 知识库引擎迁移Milvus(踩坑记录)
  • 作者: fanz
  • 创建于 : 2025-05-29 14:29:25
  • 更新于 : 2025-05-29 14:38:04
  • 链接: https://redefine.ohevan.com/sx0fd2/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
目录
Dify 知识库引擎迁移Milvus(踩坑记录)