Docker执行.sh文件连接PostgreSQL时主机名解析失败问题
问题排查与解决方案
针对你遇到的主机名解析错误问题,结合你的配置和使用场景,从以下几个核心方向排查:
1. 宿主机无法解析Docker容器名称(核心原因)
Docker容器的自定义名称(如postgres_nuevo)仅在同一Docker网络内的容器之间可以直接解析,宿主机默认无法通过容器名访问容器:
- 你测试硬编码能正常运行,大概率是硬编码时用了
localhost或宿主机IP(利用了postgres容器的端口映射) - 但.env中设置
DB_HOST=postgres_nuevo时,宿主机的DNS系统无法识别这个名称,直接触发“无法解析主机名”错误
解决方法:
- 修改
api/.env中的DB_HOST为localhost,同时DB_PORT设置为docker-compose里映射的宿主机端口(即${POSTGRES_PORT}对应的值) - 若坚持用容器名连接,可在宿主机
/etc/hosts中添加映射:容器IP postgres_nuevo,容器IP可通过docker inspect postgres_nuevo | grep "IPAddress"获取,但此方式不灵活(容器重启后IP可能变化)
2. 环境变量加载有效性验证
确认你的.sh脚本正确加载了.env文件,且变量完全匹配:
- 脚本中加载.env的命令必须是
source ./api/.env(确保执行脚本时处于项目根目录,否则需写绝对路径) - 核对
api/.env变量名:DB_HOST是否确实为postgres_nuevo(若在容器内执行脚本则有效,宿主机执行则无效)DB_USER需匹配docker-compose中POSTGRES_USER=${API_POSTGRES_USER}的实际值DB_PASSWORD对应API_POSTGRES_PASSWORD,DB_NAME对应API_POSTGRES_DB
- 可在脚本中添加
echo $DB_HOST、echo $DB_PORT等命令,直接验证变量是否正确加载
3. 简化docker exec命令(规避主机名问题)
你当前的命令是进入postgres容器后执行psql,但容器内部本身就是postgres环境,无需指定主机参数:
- 简化命令为:
此时psql会自动通过unix socket连接本地实例,无需sudo docker exec -it postgres_nuevo env PGPASSWORD="$DB_PASSWORD" psql -U "$DB_USER" -d "$DB_NAME"-h和-p参数,彻底规避主机名解析问题
4. 容器网络配置验证(针对容器内执行脚本场景)
如果你的.sh脚本是在api容器内部执行:
- 执行
docker inspect postgres_nuevo | grep Networks,确认容器已加入proxy-network和datalaketdf网络(与api容器共享网络) - 检查api容器的volumes映射:确认
./:/app已正确挂载,容器内能访问api/.env文件
内容的提问来源于stack exchange,提问作者nepko
相关产品推荐
相关产品推荐

