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

GitLab CI执行Django项目时MySQL连接报错2002求助

解决GitLab CI中Django无法连接MySQL的Socket错误

嘿,这个错误我之前在GitLab CI部署Django项目时也踩过坑,核心问题是CI环境里的MySQL是作为独立服务容器运行的,和本地依赖socket文件的连接逻辑完全不一样,下面一步步给你拆解解决思路:

1. 先给GitLab CI补上MySQL服务配置

你的CI配置片段里大概率没声明要启动MySQL服务,GitLab CI需要通过services项来引入数据库服务容器。修改你的.gitlab-ci.yml,添加以下关键配置:

# 保留你原有配置的基础上,新增这部分
services:
  - name: mysql:5.7  # 选和你的django、mysqlclient版本兼容的MySQL,5.7适配你的当前依赖
    alias: mysql  # 设置别名,后续Django配置里要用这个作为数据库主机名

variables:
  # 初始化MySQL的必要环境变量
  MYSQL_DATABASE: your_project_db  # 替换成你Django项目里的数据库名称
  MYSQL_ROOT_PASSWORD: your_db_password  # 替换成数据库密码

2. 修改Django的数据库连接逻辑

本地你可能依赖socket文件连接,但CI里MySQL是独立容器,必须用TCP/IP连接。打开项目的settings.py,调整DATABASES配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.environ.get('MYSQL_DATABASE'),  # 从CI变量读取,更灵活
        'USER': 'root',
        'PASSWORD': os.environ.get('MYSQL_ROOT_PASSWORD'),
        'HOST': 'mysql',  # 这里对应上面services里的别名
        'PORT': '3306',  # MySQL默认端口
        # 删掉所有和unix_socket相关的配置项,这是本地连接的逻辑,CI里用不上
    }
}

3. 给MySQL留足启动时间

有时候CI里MySQL容器启动了,但服务还没完全就绪,直接跑Django的migrate命令会报错。可以在CI脚本里加个等待逻辑:

# 在执行python manage.py migrate之前先跑这段
until mysqladmin ping -h"mysql" -u"root" -p"${MYSQL_ROOT_PASSWORD}" --silent; do
    echo "Waiting for MySQL service to be ready..."
    sleep 2
done

4. 确认依赖版本兼容性

你用的mysqlclient==1.3.12和Django 2.0.4、MySQL 5.7是完全兼容的,这部分不用调整。如果后续换更高版本的MySQL,再考虑升级mysqlclient到1.4+版本即可。

把这些调整都做完后,再重新触发CI流水线,应该就能解决socket连接失败的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:36:11