You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器内Chroma服务无法被同环境Service-A连接求助

问题

在Docker环境中,Service-A容器调用ChromaConnector.get_instance()时出现错误:

Could not connect to a Chroma server. Are you sure it is running?

已通过curl验证Chroma服务正常:

  • curl http://chroma:8000 返回{"detail":"Not Found"}
  • curl http://chroma:8000/api/v1/collections 返回[]
  • curl http://chroma:8000/api/v1 返回心跳信息

相关代码与配置

ChromaConnector代码

class ChromaConnector:
    _instance = None

    @classmethod
    def get_instance(cls):
        if cls._instance is None:
            cls._instance = chromadb.HttpClient(host='http://chroma', port=8000)
        return cls._instance

docker-compose.yaml配置

version: '3.8'

services:
  service-a:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "18001:18001"
    environment:
      - ENVIRONMENT=development
    depends_on:
      - kafka
      - chroma

  kafka:
    image: bitnami/kafka:latest
    ports:
      - "9094:9094"
    environment:
      - KAFKA_ENABLE_KRAFT=yes
      - KAFKA_CFG_BROKER_ID=1
      - KAFKA_CFG_NODE_ID=1
      - KAFKA_CFG_PROCESS_ROLES=broker,controller
      - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,EXTERNAL:PLAINTEXT
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://localhost:9094
      - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@:9093
      - ALLOW_PLAINTEXT_LISTENER=yes    

  chroma:
    image: chromadb/chroma:latest  
    ports:
      - "18000:8000"
    volumes:
      - chroma-data:/chroma/chroma 
    restart: unless-stopped
    command: "--workers 1 --host 0.0.0.0 --port 8000 --proxy-headers --log-config chromadb/log_config.yml --timeout-keep-alive 30"
    environment:
      - IS_PERSISTENT=TRUE   

  redis:
    image: redis:latest
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data

volumes:
  redis-data:
  chroma-data:

解决方案

1. 修正HttpClient的host参数

chromadb的HttpClient构造函数中,host参数仅需传入主机名(无需http://前缀),库会自动处理HTTP协议。修改代码如下:

class ChromaConnector:
    _instance = None

    @classmethod
    def get_instance(cls):
        if cls._instance is None:
            # 移除http://前缀,仅保留主机名chroma
            cls._instance = chromadb.HttpClient(host='chroma', port=8000)
        return cls._instance

2. 确保Chroma服务就绪后再启动Service-A

depends_on仅保证容器启动顺序,不确保服务完全就绪。给Chroma添加健康检查,让Service-A等待Chroma服务可用后再启动:
修改docker-compose.yaml中的chroma和service-a配置:

services:
  service-a:
    # 其他配置保持不变
    depends_on:
      kafka:
        condition: service_started
      chroma:
        condition: service_healthy  # 等待chroma健康检查通过

  chroma:
    # 其他配置保持不变
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/api/v1"]
      interval: 5s
      timeout: 5s
      retries: 5

验证

修改后重启容器:

docker-compose down && docker-compose up -d

进入Service-A容器重新测试连接,错误即可解决。

内容的提问来源于stack exchange,提问作者Laodao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:26:02