Docker Compose中FastAPI连接Redis遇Error 111连接拒绝问题
问题解决:FastAPI + Docker Compose + Redis-OM 容器内连接被拒绝
核心问题分析
报错ConnectionError: Error 111 connecting to localhost:6379本质是API容器内的代码仍在尝试连接容器自身的localhost,而非Redis服务容器,哪怕硬编码host为redis也没生效,大概率是环境变量未正确加载或代码未重新构建导致的。
解决方案步骤
1. 检查Dockerfile是否复制了.env.dev到容器内
如果你的Dockerfile没有将.env.dev文件复制到容器中,Settings类根本加载不到环境变量,只能使用默认的localhost。修改Dockerfile添加复制指令:
# 示例Dockerfile(根据你的基础镜像调整) FROM python:3.11-slim WORKDIR /app # 复制依赖并安装 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 关键:复制.env.dev到容器内 COPY .env.dev . # 复制项目代码 COPY . . CMD ["uv", "run", "fastapi", "dev", "--host", "0.0.0.0"]
2. 验证环境变量是否正确加载
在代码中添加打印语句,确认容器内实际读取到的Redis配置:
from redis_om import get_redis_connection, JsonModel from pydantic import BaseSettings, Field class Settings(BaseSettings): REDIS_HOST: str = "localhost" REDIS_PORT: int = 6379 class Config: env_file = (".env.dev", ".env") ENV = Settings() # 打印验证配置 print(f"当前Redis配置:HOST={ENV.REDIS_HOST}, PORT={ENV.REDIS_PORT}") redis_client = get_redis_connection( host=ENV.REDIS_HOST, port=ENV.REDIS_PORT, decode_responses=True # JsonModel需要解码响应,建议添加 ) class CustomerModel(JsonModel): first_name: str = Field(index=True) last_name: str = Field(index=True) email: str = Field(index=True) age: int = Field(index=True) bio: str | None = Field(index=True, full_text_search=True) class Meta: database = redis_client
重新构建并启动容器:
docker-compose down docker-compose build docker-compose up
查看API容器日志,若打印的HOST是redis则配置加载成功;若仍是localhost,检查.env.dev文件路径或Dockerfile的COPY指令。
3. 排除redis-om环境变量优先级问题
redis-om的get_redis_connection会优先读取REDIS_URL或REDIS_OM_URL环境变量,若容器内存在这类变量会覆盖你传入的host/port参数。在容器内执行命令检查:
docker exec -it api env | grep REDIS
若输出中有REDIS_URL=redis://localhost:6379这类内容,需删除该环境变量确保自定义配置生效。
疑问解答
为何传入正确主机后仍连localhost?
- 最常见原因是容器内未加载到
.env.dev,代码使用了Settings类的默认值;其次是代码修改后未重新构建容器,旧代码仍在运行;极少情况是存在优先级更高的REDIS_URL环境变量覆盖配置。
- 最常见原因是容器内未加载到
Docker Compose或redis-om配置是否有遗漏?
- Docker Compose配置是正确的(depends_on带健康检查、端口映射正常);redis-om需确保:环境变量正确加载、连接实例正确赋值给
Meta.database、Dockerfile复制了.env文件。
- Docker Compose配置是正确的(depends_on带健康检查、端口映射正常);redis-om需确保:环境变量正确加载、连接实例正确赋值给
内容的提问来源于stack exchange,提问作者Luigi Loria
相关产品推荐
相关产品推荐

