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

本地Build通过但Travis构建失败:PostgreSQL数据库连接被拒绝

解决Travis CI上Docker Compose连接PostgreSQL失败的问题

我之前也碰到过几乎一模一样的情况——本地Docker Compose构建测试完全正常,但Travis上总是报数据库连接拒绝的错误。结合你给出的日志,大概率是数据库服务还没完成初始化,测试脚本就提前执行导致的,你可以从这几个方向逐一排查:

1. 给数据库加启动等待逻辑,确保服务就绪

Travis的容器环境启动速度通常比本地慢,PostgreSQL容器虽然显示"启动完成",但内部的数据库服务可能还没开放端口。你可以通过两种方式解决这个时序问题:

方案A:用wait-for-it脚本等待端口开放

修改Travis的测试命令,先等待数据库端口可用再执行测试:

docker-compose run app sh -c "curl -s https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh > wait-for-it.sh && chmod +x wait-for-it.sh && ./wait-for-it.sh db:5432 -t 30 && python manage.py test && flake8"

这个脚本会持续检测db服务的5432端口,最多等待30秒,确认端口开放后才会启动测试。

方案B:给Docker Compose配置健康检查

在docker-compose.yml里给db服务添加健康检查规则,让app服务只在数据库完全就绪后才启动:

services:
  db:
    image: postgres:latest
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres

  app:
    build: .
    depends_on:
      db:
        condition: service_healthy
    environment:
      - DB_HOST=db
      - DB_NAME=postgres
      - DB_USER=postgres
      - DB_PASS=postgres

2. 检查Travis CI的Docker环境配置

确保你的.travis.yml正确启用了Docker服务,并且安装了兼容版本的Docker Compose:

language: python
python: "3.9"

services:
  - docker

before_install:
  # 更新系统并安装Docker Compose
  - sudo apt-get update
  - sudo apt-get install -y docker-compose

script:
  - docker-compose run app sh -c "python manage.py test && flake8"

如果遇到版本兼容问题,也可以用官方脚本安装指定版本的Docker Compose:

before_install:
  - curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  - chmod +x /usr/local/bin/docker-compose

3. 快速验证Django数据库配置

虽然你说和讲师代码一致,但还是可以快速确认下settings.py里的数据库配置是否匹配容器设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('DB_NAME', 'postgres'),
        'USER': os.environ.get('DB_USER', 'postgres'),
        'PASSWORD': os.environ.get('DB_PASS', 'postgres'),
        'HOST': os.environ.get('DB_HOST', 'db'),
        'PORT': 5432,
    }
}

重点确认HOST的值是db(和docker-compose里的服务名完全一致),环境变量和容器内的数据库账号密码匹配。

先从这几个方向排查,应该能解决Travis上的连接问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:57:30