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

无法从Azure Pipelines连接PostgreSQL容器的问题求助

解决Azure Pipelines中PostgreSQL服务容器主机名解析失败问题

问题原因分析

出现could not translate host name "postgres" to address错误,通常源于两个核心问题:

  • PostgreSQL服务容器尚未完全启动就绪,就执行了连接命令
  • 使用sudo执行psql时,切换了网络上下文,导致无法解析服务容器的主机名

修复方案

方案1:移除sudo并添加容器就绪等待

修改azure-pipelines.yml,移除sudo执行psql,并添加等待容器端口就绪的步骤:

resources:
  containers:
    - container: postgres
      image: postgres:13
      env:
        POSTGRES_USER: "postgres"
        POSTGRES_PASSWORD: "postgres"
pool:
  vmImage: ubuntu-latest

stages:
  - stage: run_unit_tests
    jobs:
      - job: run_unit_tests_1
        services:
          postgres: postgres
        steps:
          - script: |
              sudo apt install -y postgresql-client wait-for-it
              # 等待PostgreSQL容器的5432端口就绪,超时时间60秒
              wait-for-it postgres:5432 --timeout=60
              # 不使用sudo执行psql,通过环境变量传入密码
              psql --host=postgres --username=postgres --command="SELECT 1;"
            env:
              PGPASSWORD: postgres

方案2:直接使用服务容器的IP地址

如果主机名解析问题仍存在,可以通过docker命令获取容器IP,直接用IP连接:

# 其他配置保持不变
steps:
  - script: |
      sudo apt install -y postgresql-client
      # 获取postgres服务容器的IP地址
      POSTGRES_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q --filter "name=postgres"))
      # 循环等待容器就绪
      until psql --host=$POSTGRES_IP --username=postgres --command="SELECT 1;" > /dev/null 2>&1; do
        echo "Waiting for PostgreSQL to start..."
        sleep 2
      done
      psql --host=$POSTGRES_IP --username=postgres --command="SELECT 1;"
    env:
      PGPASSWORD: postgres

关键注意事项

  • 避免用sudo执行psql:sudo会切换到root用户,可能导致网络命名空间不一致,无法解析服务容器主机名
  • 必须等待容器就绪:PostgreSQL容器启动需要初始化时间,直接执行连接命令会因未就绪失败
  • 用PGPASSWORD环境变量传参:避免命令行明文输密码,提升安全性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:02:39