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

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
排查与修复方案

核心问题分析

  1. 容器网络访问错误:Job 运行在 existenz/builder:8.0 容器内,配置的 DB_HOST: 127.0.0.1 指向的是该容器本身,而非 Github Actions 提供的 MySQL 服务容器。在容器化的 Actions 环境中,必须通过服务名称(即 services 下的 mysql)访问数据库服务。
  2. 环境变量配置冲突:MySQL 服务同时设置了 MYSQL_ALLOW_EMPTY_PASSWORD: yes 和 MYSQL_PASSWORD: password,可能导致认证逻辑冲突;且 Laravel 环境变量未配置 DB_PASSWORD,与 MySQL 服务的密码不匹配。
  3. 端口映射覆盖不完整:仅在测试步骤覆盖了 DB_PORT,但 DB_HOST 仍指向容器内部,导致连接目标错误。

修复步骤

  1. 修正数据库连接地址
    将 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'] }}
    
  2. 清理 MySQL 服务冲突配置
    移除 MYSQL_ALLOW_EMPTY_PASSWORD: yes,保留明确的密码配置,确保与 Laravel 的 DB_PASSWORD 一致:

    mysql:
        image: mysql:latest
        env:
            MYSQL_USER: laravel
            MYSQL_PASSWORD: password
            MYSQL_DATABASE: laravel
        # ... 其他端口、健康检查配置不变
    
  3. 可选:添加数据库迁移步骤
    如果测试需要初始化数据库结构,在测试前添加迁移命令:

    - 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 03:52:40