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

GitLab CI执行PHPUnit测试时MySQL报ERROR 2002无法通过套接字连接求助

问题根因
  • 你混淆了GitLab CI Service的运行逻辑:配置services: mysql:latest时,GitLab会单独启动一个独立的MySQL容器,和你运行PHPUnit的PHP容器完全隔离,你不需要在PHP容器内额外安装mariadb-server
  • 你在PHP容器内安装了MySQL服务但没有手动启动,执行-h localhost的MySQL命令时,会尝试连接当前容器内未启动的MySQL服务,自然找不到socket文件触发报错
  • 所有MySQL操作命令混用了-h mysql(连接独立Service容器)和-h localhost(连接当前容器本地MySQL),逻辑完全错乱
  • 没有为MySQL Service配置必要的环境变量,会导致Service容器启动失败,即使你连mysql主机也会出现连接异常
  • 全局before_script已经执行了composer install,PHPUnit任务的before_script重复安装Composer属于冗余操作
修复后的完整配置
image: jakzal/phpqa:php8.0

# 全局变量,给MySQL Service用
variables:
  MYSQL_ROOT_PASSWORD: your_password
  MYSQL_DATABASE: your_test_db
  MYSQL_ALLOW_EMPTY_PASSWORD: 'no'

before_script:
  - composer install
                
stages: 
  - SecurityChecker
  - UnitTests

cache:
  paths:
    - vendor/
    - ~/.composer/cache/files    

# 依赖安全检测
security-checker:
  stage: SecurityChecker
  script:
    - local-php-security-checker composer.lock
  allow_failure: false

# PHPUnit单元测试
phpunit:
  stage: UnitTests
  services:
    - name: mysql:latest
  before_script:
    - apt-get update && apt-get dist-upgrade && apt-get install -y git libzip-dev autoconf build-essential pkg-config libmariadb-dev-compat libmariadb-dev default-mysql-client mariadb-client
    - docker-php-ext-install mysqli pdo pdo_mysql zip
    # 导入测试数据,连接的是独立的MySQL Service容器
    - mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -h mysql "$MYSQL_DATABASE" < "database.sql"
  script:
    - vendor/bin/phpunit --testdox
  allow_failure: false
额外注意事项
  • 你项目内PHPUnit对应的数据库配置文件里,数据库主机地址要改为mysql(和Service名称一致),不要用localhost或者127.0.0.1
  • 如果你的SQL文件里包含创建数据库的语句,可以去掉variables里的MYSQL_DATABASE配置
  • 把MYSQL_ROOT_PASSWORD的值替换为你项目实际使用的测试数据库密码即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:36:02