当前位置: 首页 > 知识库问答 >
问题:

docker compose 从django链接chromadb 报错 HTTPConnectionPool Max retries exceeded with url如何修复?

夹谷硕
2023-10-02

Docker中有两个container,一个django,一个chroma向量数据库,从Django中连接chroma报错,下面是docker-compose.yml文件:

version: '3.9'services:  django:    container_name: django    build:      context: ./app    command: python manage.py runserver 0.0.0.0:8000    volumes:      - ./app:/Users/apple/Docker/app/    ports:      - '8000:8000'    expose:      - 8000  chroma:    container_name: chroma    image: ghcr.io/chroma-core/chroma:latest    volumes:      - index_data:/Users/apple/Docker/app/data    ports:      - '8989:8989'    expose:      - 8989volumes:  index_data:    name: my-db-data

下面是Dockerfile文件

FROM python:3.9WORKDIR /Users/apple/Docker/appENV PYTHONDONTWRITEBYTECODE 1ENV PYTHONUNBUFFERED 1RUN pip install --upgrade pipCOPY ./requirements.txt /Users/apple/Docker/app/requirements.txtRUN pip3 install -r requirements.txtCOPY ./entrypoint.sh /Users/apple/Docker/app/entrypoint.shCOPY . /Users/apple/Docker/app/EXPOSE 8000ENTRYPOINT ["/Users/apple/Docker/app/entrypoint.sh"]

从Django中连接chroma向量数据看,代码如下:

from rest_framework.decorators import api_viewfrom rest_framework.response import Responseimport chromadbfrom chromadb.config import Settingschroma_client = chromadb.HttpClient(    host='localhost',    port=8989,    settings=Settings(allow_reset=True, anonymized_telemetry=False))@api_view(['GET'])def index(request):    sample_collection = chroma_client.get_or_create_collection(name="sample_collection")    print(sample_collection)    return Response({        'info': 'Hello world.'    })

报错如下:

urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=8989): Max retries exceeded with url: /api/v1/collections (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f35e0e3c4f0>: Failed to establish a new connection: [Errno 111] Connection refused'))

Docker的容器运行情况:

CONTAINER ID    PORTS.                              NAMES 2710918946b0    0.0.0.0:8000->8000/tcp              django 18ee5e4e3a7d    8000/tcp, 0.0.0.0:8989->8989/tcp    chroma 

请各位大佬帮忙看看,谢谢。

共有2个答案

况鸿雪
2023-10-02
    chroma_client = chromadb.HttpClient(    host='localhost',    port=8989,    settings=Settings(allow_reset=True, anonymized_telemetry=False))

这里写的localhost,你可能需要把这里改成 chroma,django这个容器里面访问localhost,只能访问到django容器的localhost,它是属于一个独立的网络命名空间(既不属于chroma也不属于宿主机)。

袁恩
2023-10-02

从你的问题描述中,这个问题看起来是因为你的Django应用无法连接到Chroma数据库。具体的错误是Max retries exceeded,这通常是因为连接被拒绝,尝试建立连接的次数超过了最大限制。

这可能有几个原因:

  1. Docker容器网络设置问题:Docker容器默认在独立的网络环境中运行,所以你需要确保两个容器能够互相访问。你可以在docker-compose.yml文件中添加networks:部分来定义网络,并使用--network选项来为你的容器指定网络。
  2. Chroma服务可能没有运行:你需要确保Chroma服务在启动并监听8989端口。你可以在Docker日志中查看Chroma服务的状态。
  3. 端口可能被占用:你需要确保在运行Django容器的机器上,没有其他服务占用了8989端口。

你可以尝试以下步骤来解决你的问题:

  1. 检查Chroma服务的状态:在运行docker logs <chroma-container-id>,查看Chroma服务的日志,看是否有错误信息或者服务是否已经启动。
  2. 检查端口是否被占用:运行netstat -tuln | grep 8989看是否有其他服务占用了8989端口。
  3. 修改Django配置:在Django应用中,确保你正确配置了Chroma服务的地址和端口。根据你当前的网络设置,你可能需要将localhost更改为127.0.0.10.0.0.0
  4. 如果上述步骤不能解决问题,尝试使用桥接网络(bridge network):在docker-compose.yml文件中添加以下内容:
networks:  default:    driver: bridge

然后使用--network=networks.default选项来为你的容器指定网络。

希望这些建议能帮助你解决问题。

 类似资料:
  • 如何修复此错误? Traceback(最近一次调用):文件"C:/用户/HP/下载/cv_api/cv_api/manage.py",第10行,execute_from_command_line(sys.argv) 文件“F:\ anaconda 2 installation \ lib \ site-packages \ django-1 . 10 . 5-py 2.7 . egg \ djan

  • 我有这个django网站翻译从英语到德语从locale/lc_messages/django.po和django.mo文件。但是,当我试着翻译用德语字母写的单词时,它给了我一个错误

  • 问题内容: 我遇到了有关monkey修补Django的帖子: 我知道这不是理想的选择,最好User通过单独的模型添加字段和函数Profile。 话虽如此,我只想了解这是如何工作的: 我将把monkey补丁代码放在哪里? 代码何时运行-仅运行一次?每个Python解释器启动一次?每个请求一次? 大概我仍然需要更改数据库架构。因此,如果我放下桌子运行,会syncdb“知道”是否已添加新字段吗?如果没有

  • E立方管理平台表单填报时超链接不能使用,点击这些超链接出现“由于本机的限制,该操作已被取消,请与系统管理员联系”的提示,可用以下方法解决: 一、Office 2003       解决方法:IE - 工具 - Internet选项,点“程序”,在“默认的WEB浏览器”中点“设为默认值”,就可以解决这个问题,在EXCEL中点链接不再提示“由于本机的限制,该操作已被取消,请与系统管理员联系”这个信息了

  • 我现在的Jenkins运行多个构建。每个构建/运行都将创建自己的testng-results.xml(target/surefire-reports/testng-results.xml) 我检查了Jenkins job主页上的HTML报告的结果(该报告只显示最新构建/运行的报告)。 不管怎样,为了得到这个?

  • 我们确实发现了一篇文章指出了java 11中TLS1.3的一个问题(https://webtide.com/openjdk-11-and-tls-1-3-issues/),但是我们已经尝试了java 12版本,但没有成功,所以我认为这不是问题所在。 因此,我们现在必须决定是通过强制使用TLS1.2来回归,还是继续寻找另一种解决方案。