我正在使用 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
。
我尝试过的:
.env.dev
已正确装入集装箱内。ping redis and redis-cli -h redis -p 6379 ping → PONG
)。因此,我不明白...
redis-om
,为什么 localhost:6379
仍然默认为 get_redis_connection
?redis-om
初始化连接的方式是否缺少某些内容?当您在单独的容器中运行 FastAPI 和 redis 时,对于其他容器来说,redis 的主机不再是
localhost
,而是您应该通过运行 docker inspect <redis_container_name>
来获取主机,您会发现 IPAdress 在我的例子中是 "IPAddress": "172.17.0.2"
。
您需要配置快速 api 以连接到该主机,方法是将 localhost
替换为 IPAddress。