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

使用GitHub Actions执行Django迁移时遇psycopg连接错误:域名解析失败

解决GitHub Actions中Django迁移的psycopg域名解析错误

问题原因

你遇到的psycopg.OperationalError: connection is bad: Temporary failure in name resolution错误,核心原因有两点:

  1. GitHub Actions的ubuntu-latest runner是独立虚拟机环境,并非Docker容器;你配置的db服务是运行在该虚拟机上的Docker容器,虚拟机无法直接通过db主机名解析到这个容器。
  2. 给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:42:51