本地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
相关产品推荐
相关产品推荐

