Github Actions无法连接MySQL实例问题求助
问题:Laravel Github Actions 无法连接 MySQL 实例
报错信息:
SQLSTATE[HY000] [2002] Connection refused
环境说明:
- 基于
ubuntu-latest运行 Actions,使用existenz/builder:8.0容器 - MySQL 容器启动日志显示已健康:
mysql service is starting
mysql service is healthy. - 仅测试套件环节连接失败,其他步骤正常
Actions 配置文件:
name: Doing some tests n stuff on: push jobs: tests: runs-on: ubuntu-latest container: existenz/builder:8.0 env: APP_ENV: testing DB_CONNECTION: mysql DB_USERNAME: laravel DB_DATABASE: laravel DB_HOST: 127.0.0.1 DB_PORT: 3306 BROADCAST_DRIVER: log CACHE_DRIVER: redis QUEUE_CONNECTION: redis SESSION_DRIVER: redis services: mysql: image: mysql:latest env: MYSQL_ALLOW_EMPTY_PASSWORD: yes MYSQL_USER: laravel MYSQL_PASSWORD: password MYSQL_DATABASE: laravel ports: - 3306/tcp options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 redis: image: redis ports: - 6379/tcp options: --health-cmd="redis-cli ping" --health-interval=10s --health-timeout=5s --health-retries=3 steps: - name: Checkout code uses: actions/checkout@v3 - name: Install extensions run: apk -U --no-cache add php8-sodium php8-pdo_mysql - name: Install Composer dependencies run: composer install --prefer-dist --no-interaction - name: Create APP_KEY run: echo "APP_KEY=" > .env - name: Generate APP_KEY run: php artisan key:generate - name: Clear Config run: php artisan config:clear - name: Run Testsuite run: vendor/bin/phpunit env: DB_PORT: ${{ job.services.mysql.ports['3306'] }} REDIS_PORT: ${{ job.services.redis.ports['6379'] }} - name: Upload artifacts uses: actions/upload-artifact@master if: failure() with: name: Logs path: ./storage/logs
排查与修复方案
核心问题分析
- 容器网络访问错误:Job 运行在
existenz/builder:8.0容器内,配置的DB_HOST: 127.0.0.1指向的是该容器本身,而非 Github Actions 提供的 MySQL 服务容器。在容器化的 Actions 环境中,必须通过服务名称(即services下的mysql)访问数据库服务。 - 环境变量配置冲突:MySQL 服务同时设置了
MYSQL_ALLOW_EMPTY_PASSWORD: yes和MYSQL_PASSWORD: password,可能导致认证逻辑冲突;且 Laravel 环境变量未配置DB_PASSWORD,与 MySQL 服务的密码不匹配。 - 端口映射覆盖不完整:仅在测试步骤覆盖了
DB_PORT,但DB_HOST仍指向容器内部,导致连接目标错误。
修复步骤
修正数据库连接地址
将DB_HOST改为服务名称mysql,可选择修改 Job 级环境变量,或在测试步骤中覆盖:# 方式一:修改 Job 全局环境变量 env: # ... 其他变量 DB_HOST: mysql DB_PASSWORD: password # 方式二:在测试步骤中单独覆盖 - name: Run Testsuite run: vendor/bin/phpunit env: DB_HOST: mysql DB_PORT: ${{ job.services.mysql.ports['3306'] }} DB_PASSWORD: password REDIS_HOST: redis REDIS_PORT: ${{ job.services.redis.ports['6379'] }}清理 MySQL 服务冲突配置
移除MYSQL_ALLOW_EMPTY_PASSWORD: yes,保留明确的密码配置,确保与 Laravel 的DB_PASSWORD一致:mysql: image: mysql:latest env: MYSQL_USER: laravel MYSQL_PASSWORD: password MYSQL_DATABASE: laravel # ... 其他端口、健康检查配置不变可选:添加数据库迁移步骤
如果测试需要初始化数据库结构,在测试前添加迁移命令:- name: Run Database Migrations run: php artisan migrate --force env: DB_HOST: mysql DB_PORT: ${{ job.services.mysql.ports['3306'] }} DB_PASSWORD: password
内容的提问来源于stack exchange,提问作者BigJobbies
相关产品推荐
相关产品推荐

