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

