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

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这类内容,需删除该环境变量确保自定义配置生效。

疑问解答

  1. 为何传入正确主机后仍连localhost?

    • 最常见原因是容器内未加载到.env.dev,代码使用了Settings类的默认值;其次是代码修改后未重新构建容器,旧代码仍在运行;极少情况是存在优先级更高的REDIS_URL环境变量覆盖配置。
  2. Docker Compose或redis-om配置是否有遗漏?

    • Docker Compose配置是正确的(depends_on带健康检查、端口映射正常);redis-om需确保:环境变量正确加载、连接实例正确赋值给Meta.database、Dockerfile复制了.env文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:08:24