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

无法解析PostgreSQL主机名致Alembic连接失败,求解决方案

解决Alembic在Docker容器内无法连接PostgreSQL的问题

问题核心

执行alembic upgrade head时触发错误:

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not translate host name "postgresql" to address: Name or service not known

原因分析

  1. 容器网络隔离:手动进入容器执行命令时,若容器不在Docker Compose创建的专属网络中,无法通过服务名postgresql解析到数据库容器。Docker Compose默认会为服务创建自定义网络,仅该网络内的容器可通过服务名互相访问。
  2. Dockerfile配置覆盖:Dockerfile中的RUN rm -rf alembic && alembic init alembic会在镜像构建阶段重新初始化Alembic,覆盖本地已有的env.py和alembic.ini配置,导致运行时配置失效。
  3. 环境变量加载异常:若容器内未正确加载.env文件,SQLALCHEMY_DATABASE_URL无法被正常读取,导致连接地址错误。

解决方案

方案1:通过Docker Compose直接执行迁移(推荐)

在宿主机上执行以下命令,确保容器处于正确的网络环境中:

docker-compose run --rm medication_request_api alembic upgrade head

该命令会在medication_request_api服务的容器内执行迁移,自动加入Compose自定义网络,可正常解析postgresql服务名。

方案2:进入Compose网络内的容器执行命令

若需手动进入容器操作,先确保容器运行在Compose网络中:

  1. 启动所有服务:
docker-compose up -d
  1. 进入API容器:
docker exec -it FastAPI_Medication bash

此时容器处于Compose自定义网络内,执行alembic upgrade head即可正常连接数据库。

方案3:修复Dockerfile中的Alembic初始化步骤

移除Dockerfile中覆盖本地Alembic配置的命令,保留项目原有的配置文件:
修改后的Dockerfile片段:

# 移除以下两行
# RUN rm -rf alembic && alembic init alembic

# 保留原启动命令
CMD alembic upgrade head && uvicorn app.main:app --host 0.0.0.0 --port 8000

方案4:验证环境变量加载

在容器内执行以下命令,确认环境变量是否正确加载:

echo $SQLALCHEMY_DATABASE_URL

若输出为空,检查.env文件是否被正确复制到容器内(你的Dockerfile已包含COPY . /app,此步骤无需额外修改)。

额外检查点

  • 确认docker-compose.yml中postgresql服务的healthcheck配置有效,确保数据库完全启动后API容器才开始运行(你的配置已设置depends_on的service_healthy条件,此部分正确)。
  • 不要将数据库主机改为localhost,容器内的localhost指向容器自身,无法访问数据库容器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 03:54:52