Docker化FastAPI应用无法连接Docker化PostgreSQL数据库求助
Docker化FastAPI无法连接PostgreSQL容器的解决方法
核心问题:环境变量名不匹配
你的docker-compose.yml中定义的环境变量名称(如DATABASE_HOSTNAME)和FastAPI配置类Settings中的变量名(如DB_HOST)不一致,导致应用无法读取到正确的数据库主机地址,始终使用默认的127.0.0.1尝试连接(容器内的127.0.0.1指向自身,而非PostgreSQL容器)。
解决步骤
1. 统一环境变量与配置类的映射
有两种方式可以修复:
方式一:修改docker-compose.yml的环境变量名
将web服务的环境变量名调整为与Settings类一致:
services: web: # ...其他配置 environment: - DB_HOST=db - DB_PORT=5432 - DB_PASSWORD=postgrespass - DB_NAME=ques_and_ans_api - DB_USER=postgres # ...其他配置
方式二:修改Settings类的环境变量映射
如果不想改动docker-compose配置,可以在Settings类中通过Field指定环境变量别名:
from pydantic import BaseSettings, Field class Settings(BaseSettings): SERVICE_NAME: str = 'Q&A_API' DB_HOST: str = Field(default='127.0.0.1', env='DATABASE_HOSTNAME') DB_PORT: int = Field(default=5432, env='DATABASE_PORT') DB_USER: str = Field(env='DATABASE_USERNAME') DB_PASSWORD: str = Field(env='DATABASE_PASSWORD') DB_NAME: str = Field(default='ques_and_ans_api', env='DATABASE_NAME') class Config: env_file = '.env' env_file_encoding = 'utf-8'
2. 优化数据库就绪检查(可选但推荐)
当前使用的while !</dev/tcp/db/5432仅检查端口是否开放,无法确保PostgreSQL服务完全初始化完成。可以改用pg_isready工具做更可靠的检查:
步骤1:在Dockerfile中安装postgresql-client
FROM python:3.10 WORKDIR /code ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # 安装postgresql-client用于pg_isready检查 RUN apt-get update && apt-get install -y postgresql-client && rm -rf /var/lib/apt/lists/* COPY ./requirements.txt /code/requirements.txt RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt COPY . /code
步骤2:修改web服务的command命令
services: web: # ...其他配置 command: bash -c 'until pg_isready -h db -p 5432 -U postgres; do sleep 1; done; alembic upgrade head; uvicorn main:app --host 0.0.0.0 --port 8001 --reload' # ...其他配置
3. 验证配置
修改完成后,重新构建并启动容器:
docker compose up --build
此时FastAPI应用应该能正确识别PostgreSQL容器的主机名db,并成功建立连接。
内容的提问来源于stack exchange,提问作者Michael_ON
相关产品推荐
相关产品推荐

