容器环境执行Alembic迁移命令报错:名称解析临时失败
错误原因
这个Temporary failure in name resolution错误的核心是本地环境无法解析数据库容器的主机名giatros_db:
- Docker容器的主机名(比如这里的
giatros_db)只有在Docker内部的专属网络中才能被DNS解析,直接在宿主机执行Alembic命令时,宿主机系统不知道这个主机名对应的IP地址,因此无法连接到数据库容器。
解决方法
方法1:修改数据库连接地址为本地可访问地址
- 先确认数据库容器已经将5432端口映射到宿主机(比如通过
docker run -p 5432:5432 ...或docker-compose的ports配置) - 修改
.env文件中的DATABASE_URL,把giatros_db替换为localhost:DATABASE_URL=postgresql+psycopg://app_user:app_password@localhost:5432/app_db - 重新执行Alembic迁移命令即可。
方法2:在应用容器内部执行迁移命令
应用容器和数据库容器处于同一个Docker网络,能正常解析giatros_db主机名:
- 进入应用容器的终端:
docker exec -it <你的应用容器名称> /bin/bash - 在容器内部切换到项目目录,执行Alembic命令:
alembic revision --autogenerate -m "create cases table"
方法3:直接使用数据库容器的IP地址(临时方案)
如果不想修改配置或进入容器,可以先获取数据库容器的IP,替换到连接地址中:
- 执行命令获取数据库容器IP:
docker inspect giatros_db | grep -oP '(?<="IPAddress": ")[^"]+' - 修改
.env中的DATABASE_URL,把giatros_db替换为查到的IP,比如:DATABASE_URL=postgresql+psycopg://app_user:app_password@172.17.0.3:5432/app_db
注意:容器重启后IP可能会变化,不推荐长期使用这种方法。
内容的提问来源于stack exchange,提问作者Gabriel Ribeiro
相关产品推荐
相关产品推荐

