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
相关产品推荐
相关产品推荐

