GitLab CI流水线运行失败,Django无法连接PostgreSQL服务如何解决?
GitLab CI PostgreSQL连接失败修复方案
问题根因
你当前的报错是因为Django默认尝试访问构建容器本地的PostgreSQL服务,但GitLab CI中配置的postgres:latest服务是运行在独立容器中的,和你的Python构建容器是分开的,所以构建容器本地不存在PostgreSQL的Unix套接字文件,也没有本地运行的PostgreSQL进程。
修复步骤
第一步:完善CI配置的环境变量
PostgreSQL容器启动需要配置用户名、密码参数,缺失会导致服务启动异常,修改你.gitlab-ci.yml的variables区块如下:
variables: POSTGRES_DB: projectdb POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres # 若你的项目支持读取DATABASE_URL环境变量(如使用dj-database-url),可直接加这行无需修改项目代码 DATABASE_URL: "postgres://postgres:postgres@postgres:5432/projectdb"
第二步:调整Django数据库配置
修改项目settings.py中的数据库连接配置,将HOST参数从空值/localhost改为postgres(GitLab CI中服务容器的默认主机名就是服务名本身),端口填5432,用户名密码和上一步配置的保持一致即可:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'projectdb', 'USER': 'postgres', 'PASSWORD': 'postgres', 'HOST': 'postgres', 'PORT': '5432', } }
第三步:可选添加服务等待逻辑
如果修改后仍偶现连接失败,是因为PostgreSQL服务启动需要时间,migrate命令执行时服务还没完全就绪,可以在script的migrate命令前添加等待逻辑:
build: stage: build script: - pip install -r requirements.txt # 新增以下两行等待PostgreSQL启动 - apt-get update && apt-get install -y netcat - until nc -z postgres 5432; do echo "等待PostgreSQL就绪..."; sleep 1; done - python manage.py migrate only: - EC-30
内容的提问来源于stack exchange,提问作者Sammy
相关产品推荐
相关产品推荐

