Laravel Sail部署至服务器遇SQLSTATE[HY000] [2002]连接拒绝问题
解决方案:Laravel Sail 连接 MySQL 容器失败问题
核心问题分析
你的配置存在两处关键冲突:一是MySQL容器启动命令的权限跳过参数与环境变量初始化配置冲突,二是.env文件中配置项的引号可能导致参数解析异常,最终引发容器间连接失败。
修复步骤
1. 修正 MySQL 容器启动命令
docker-compose.yml中--skip-grant-tables参数会跳过权限校验,导致MYSQL_USER、MYSQL_PASSWORD等初始化环境变量无法生效,移除该参数:
mysql: image: 'mysql:8.0.36' command: --default-authentication-plugin=mysql_native_password ports: - '${FORWARD_DB_PORT:-3306}:3306' environment: MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}' MYSQL_ROOT_HOST: '%' MYSQL_DATABASE: '${DB_DATABASE}' MYSQL_USER: '${DB_USERNAME}' MYSQL_PASSWORD: '${DB_PASSWORD}' MYSQL_ALLOW_EMPTY_PASSWORD: 1 restart: always volumes: - 'sail-mysql:/var/lib/mysql' networks: - sail
2. 清理旧数据卷并重建容器
之前的清理操作可能未彻底清除残留的数据库卷,执行以下命令完全重置:
# 停止容器并删除关联卷 sail down -v # 删除命名卷 docker volume rm sail-mysql # 重新启动并初始化容器 sail up -d
3. 修正 .env 文件配置
移除配置项的引号,避免参数解析错误:
DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=dbname DB_USERNAME=sail DB_PASSWORD=password
4. 正确测试容器间连接
通过sail shell连接MySQL时,需指定容器名作为主机(容器内无本地socket):
# 进入Laravel容器 sail shell # 连接MySQL容器 mysql -h mysql -u sail -p
若能成功连接,说明容器间网络正常,问题已解决。
5. 验证Laravel配置文件
确保config/database.php正确读取.env参数:
'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ],
内容的提问来源于stack exchange,提问作者dz0nika
相关产品推荐
相关产品推荐

