无法解析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
原因分析
- 容器网络隔离:手动进入容器执行命令时,若容器不在Docker Compose创建的专属网络中,无法通过服务名
postgresql解析到数据库容器。Docker Compose默认会为服务创建自定义网络,仅该网络内的容器可通过服务名互相访问。 - Dockerfile配置覆盖:Dockerfile中的
RUN rm -rf alembic && alembic init alembic会在镜像构建阶段重新初始化Alembic,覆盖本地已有的env.py和alembic.ini配置,导致运行时配置失效。 - 环境变量加载异常:若容器内未正确加载
.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网络中:
- 启动所有服务:
docker-compose up -d
- 进入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
相关产品推荐
相关产品推荐

