Redis 错误 111:使用 FastAPI 在 Docker Compose 中连接被拒绝

问题描述 投票:0回答:1

我正在使用 Docker Compose 和 Redis(特别是 redis-om-python)开发 FastAPI 项目,但是当 API 和 Redis 在 Docker 容器中运行时,我不断遇到

ConnectionError: Error 111 connecting to localhost:6379. Connection refused
错误。

我的

docker-compose
看起来像这样:

services:
  api:
    build: .
    container_name: api
    command: uv run fastapi dev --host 0.0.0.0
    ports:
      - "8000:8000"
    env_file:
      - .env.dev
    depends_on:
      redis:
        condition: service_healthy

  redis:
    image: redis/redis-stack:latest
    container_name: redis
    ports:
      - "6379:6379"
      - "8001:8001"
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      retries: 5
      start_period: 5s

.env.dev
文件中我有:

REDIS_HOST=redis
REDIS_PORT=6379

我正在使用

redis-om
将数据作为 NoSQL 数据库存储在 Redis 中。以下是我初始化连接的方式:

from redis_om import get_redis_connection, JsonModel
from pydantic import BaseSettings, Field
import os

class Settings(BaseSettings):
    REDIS_HOST: str = "localhost"
    REDIS_PORT: int = 6379

    class Config:
        env = os.getenv("ENV")  # Loads the correct environment
        env_file = (".env.dev", ".env")

ENV = Settings()

redis_client = get_redis_connection(host=ENV.REDIS_HOST, port=ENV.REDIS_PORT)

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

注意:Settings 和 CustomerModel 位于两个单独的文件中,我将它们写在一起只是为了简化说明。

如果我在容器中运行 Redis 并在本地运行 FastAPI 应用程序,它会按预期工作。但是,如果我在容器中同时运行 API 和 Redis,则会出现上述错误。 即使我硬编码

redis
而不是 localhost (
host="redis"
),错误仍然指向日志中的
localhost:6379

我尝试过的

  1. 确认
    .env.dev
    已正确装入集装箱内。
  2. 验证容器之间的连接性 (
    ping redis and redis-cli -h redis -p 6379 ping → PONG
    )。
  3. 硬编码“redis”而不是使用环境变量。
  4. 检查了Redis健康状态(docker ps、docker log redis)。
  5. 修剪了docker系统并完全重建了容器。

因此,我不明白...

  1. 尽管明确将正确的主机 (redis) 和端口 (6379) 传递给
    redis-om
    ,为什么
    localhost:6379
    仍然默认为
    get_redis_connection
  2. 我的 Docker Compose 设置或
    redis-om
    初始化连接的方式是否缺少某些内容?
docker docker-compose redis fastapi redis-om
1个回答
0
投票

当您在单独的容器中运行 FastAPI 和 redis 时,对于其他容器来说,redis 的主机不再是

localhost
,而是您应该通过运行
docker inspect <redis_container_name>
来获取主机,您会发现 IPAdress 在我的例子中是
"IPAddress": "172.17.0.2"
。 您需要配置快速 api 以连接到该主机,方法是将
localhost
替换为 IPAddress。

© www.soinside.com 2019 - 2024. All rights reserved.