GitHub Workflow配置Laravel CI时MySQL报1045访问被拒错误如何解决
修复方案
问题根因
- 同时运行了两个独立的MySQL实例:你在services中配置的MySQL容器实例,和你手动启动的Ubuntu宿主系统自带的MySQL实例,两者的用户、端口、数据完全隔离,你手动执行的数据库操作为宿主实例生效,而Laravel尝试连接的是容器实例,操作完全错位。
- DB_PORT配置错误:你填写的
33306:3306/tcp是Docker端口映射规则,不是实际访问端口,Laravel数据库配置只需填写宿主机侧的映射端口33306。 .env.testing缺少数据库密码配置:报错提示using password: NO,说明程序未读取到数据库密码参数。- 手动创建用户的步骤无效:
mysql -u runner默认没有操作宿主MySQL的权限,即使操作成功,也和Laravel需要连接的容器MySQL无关。 - 你配置中出现的homestead用户是你自行定义的:在services的MySQL环境变量中你指定了
MYSQL_USER: 'homestead',MySQL官方容器启动时会自动创建该用户,不需要你手动创建。
修复步骤
- 删除冗余的MySQL操作步骤,从配置中移除以下四个步骤:
- name: Start mysql service run: sudo /etc/init.d/mysql start - name: Setup database user run: mysql -u runner -e 'CREATE USER 'worker'@'localhost' IDENTIFIED BY 'secret';' - name: Flush privileges run: mysql -u worker --password=secret -e 'FLUSH PRIVILEGES;' - name: Create testing database run: mysql -u worker --password=secret -e 'CREATE DATABASE IF NOT EXISTS content_information_test;'
你配置的MySQL容器启动时会自动完成数据库创建、homestead用户创建及权限授予操作,无需额外执行。
- 修正
.env.testing的数据库配置,确保包含以下参数:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=33306 DB_DATABASE=content_information_test DB_USERNAME=homestead DB_PASSWORD=secret
- 修正migrate和phpunit步骤中的DB_PORT环境变量:
将两处的DB_PORT: 33306:3306/tcp修改为DB_PORT: 33306,修改后对应步骤配置如下:
- name: Migrate Test Database run: php artisan migrate --env=testing --seed --force env: DB_PORT: 33306 REDIS_PORT: ${{ job.services.redis.ports['6379'] }} - name: Execute tests (Unit and Feature tests) via PHPUnit run: vendor/bin/phpunit env: DB_PORT: 33306 REDIS_PORT: ${{ job.services.redis.ports['6379'] }}
修改完成后重新运行流水线即可正常执行迁移。
内容的提问来源于stack exchange,提问作者Mathmeeeeen
相关产品推荐
相关产品推荐

