使用GitHub Actions执行Django迁移时遇psycopg连接错误:域名解析失败
解决GitHub Actions中Django迁移的psycopg域名解析错误
问题原因
你遇到的psycopg.OperationalError: connection is bad: Temporary failure in name resolution错误,核心原因有两点:
- GitHub Actions的
ubuntu-latestrunner是独立虚拟机环境,并非Docker容器;你配置的db服务是运行在该虚拟机上的Docker容器,虚拟机无法直接通过db主机名解析到这个容器。 - 给postgres容器设置的
POSTGRES_HOST: db是多余的,这会导致postgres仅监听db主机名的连接请求,阻断了来自虚拟机localhost的连接。
修复步骤
1. 清理postgres服务的冗余配置
移除db服务中不必要的POSTGRES_HOST环境变量,让postgres默认监听所有地址:
services: db: image: postgres env: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: github-actions ports: - 5432:5432 options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
2. 修改迁移步骤的数据库主机配置
由于postgres容器的5432端口已映射到虚拟机的localhost,将迁移步骤的POSTGRES_HOST改为localhost:
- name: Run Migrations env: API_SECRET_KEY: secret-key POSTGRES_HOST: localhost POSTGRES_PASSWORD: password POSTGRES_PORT: 5432 POSTGRES_USER: postgres POSTGRES_DB: github-actions run: | source .venv/bin/activate python manage.py migrate
3. 确认Django配置读取环境变量
确保Django的settings.py中数据库配置正确读取环境变量,示例如下:
import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.getenv('POSTGRES_DB', 'github-actions'), 'USER': os.getenv('POSTGRES_USER', 'postgres'), 'PASSWORD': os.getenv('POSTGRES_PASSWORD', 'password'), 'HOST': os.getenv('POSTGRES_HOST', 'localhost'), 'PORT': os.getenv('POSTGRES_PORT', '5432'), } }
额外说明
如果后续想恢复用Pull Request触发流程,只需调整on配置即可,无需修改数据库连接部分:
on: pull_request: branches: - main # 替换为你的目标分支
内容的提问来源于stack exchange,提问作者Brendan Tan
相关产品推荐
相关产品推荐

