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

