GitLab CI配置MySQL服务失败求助:Symfony项目无法连接数据库
解决GitLab CI中Symfony应用无法连接MySQL服务的问题
我之前在GitLab CI上跑Symfony测试时也踩过一模一样的坑!你已经声明了MySQL服务,但还需要几个关键配置让应用和数据库服务正确关联,下面一步步来帮你搞定:
1. 给MySQL服务补充初始化环境变量
MySQL镜像默认需要配置核心环境变量才能正常启动、创建数据库和用户,你得在services段里补上这些:
services: - docker:dind - name: mysql:5.7.21 alias: db variables: MYSQL_ROOT_PASSWORD: your_root_password MYSQL_DATABASE: symfony_test_db MYSQL_USER: symfony_test_user MYSQL_PASSWORD: symfony_test_pass
这些变量会自动初始化MySQL实例,帮你建好测试需要的数据库和权限用户。
2. 给Symfony应用配置正确的数据库连接变量
在你的测试/构建Job里,设置Symfony依赖的DATABASE_URL——这里要记住:GitLab CI会把Job容器和Services容器放在同一个内部网络,服务的alias(也就是你设的db)就是数据库的主机名,直接用它就行:
stages: - build - test test: stage: test # 替换成你项目适配的PHP镜像,比如php:8.1-cli对应Symfony 6+ image: php:7.4-cli variables: DATABASE_URL: "mysql://symfony_test_user:symfony_test_pass@db:3306/symfony_test_db?serverVersion=5.7" script: # 安装Composer依赖 - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer - composer install --no-interaction --optimize-autoloader # 关键步骤:等待MySQL完全启动就绪 - until nc -z db 3306; do echo "Waiting for MySQL to be ready..."; sleep 2; done # 执行数据库迁移和测试命令 - php bin/console doctrine:migrations:migrate --no-interaction - php bin/phpunit
3. 必加:等待MySQL服务就绪
MySQL启动需要一点初始化时间,如果应用在数据库完全准备好前就尝试连接,肯定会报连接失败。上面的nc -z db 3306会循环检查3306端口状态,直到MySQL就绪才继续执行后续命令。
如果你的镜像里没有nc命令,也可以用MySQL自带工具检查:
- until mysqladmin ping -h db -u symfony_test_user -psymfony_test_pass --silent; do sleep 2; done
原理说明
GitLab CI默认会把Job容器和所有声明的Services容器放在同一个内部网络,通过服务的alias就能直接访问对应服务。只要你配置了正确的数据库凭证,再加个等待服务启动的步骤,Symfony就能顺利连接到MySQL执行测试了。
内容的提问来源于stack exchange,提问作者mpiot
相关产品推荐
相关产品推荐

