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

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环境,无需指定主机参数:

  • 简化命令为:
    sudo docker exec -it postgres_nuevo env PGPASSWORD="$DB_PASSWORD" psql -U "$DB_USER" -d "$DB_NAME"
    
    此时psql会自动通过unix socket连接本地实例,无需-h和-p参数,彻底规避主机名解析问题

4. 容器网络配置验证(针对容器内执行脚本场景)

如果你的.sh脚本是在api容器内部执行:

  • 执行docker inspect postgres_nuevo | grep Networks,确认容器已加入proxy-network和datalaketdf网络(与api容器共享网络)
  • 检查api容器的volumes映射:确认./:/app已正确挂载,容器内能访问api/.env文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 10:35:00