Windows10+WSL2环境下调用Cron连接Docker数据库遇权限拒绝求助
解决Windows/WSL控制台调用Cron无法连接Docker数据库的问题
核心原因
控制台执行的Cron处于主机(Windows/WSL)环境,而非Lando/Docker容器内,因此:
- 数据库用户的
localhost权限仅针对容器内部,主机发起的连接会被判定为外部IP访问 - 主机无法直接使用容器内的服务名(如
db)访问数据库,需用端口映射后的地址
具体解决步骤
1. 调整数据库用户访问权限
容器内的xxx@localhost仅允许容器内部连接,主机访问需要给用户开放外部IP权限:
- 进入phpMyAdmin或容器内的MySQL终端,执行SQL:
-- 允许用户从任意IP访问(若需限制可替换%为WSL/Windows的具体IP) GRANT ALL PRIVILEGES ON your_database_name.* TO 'xxx'@'%' IDENTIFIED BY 'your_password'; FLUSH PRIVILEGES;
2. 修改Cron的数据库连接配置
在Yii2的控制台配置文件(console/config/main.php)中,单独设置数据库连接参数:
return [ 'components' => [ 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=127.0.0.1;dbname=your_database_name', // 用主机可访问的地址 'username' => 'xxx', 'password' => 'your_password', 'port' => '3306', // 对应Docker映射到主机的端口(可在Lando日志/配置中查看) ], ], ];
- 若WSL内访问有问题,可尝试用
host.docker.internal代替127.0.0.1,这是Docker提供的主机别名
3. 确保WSL与Docker网络互通
- 打开Docker Desktop设置,进入
Resources > WSL Integration,勾选你正在使用的WSL发行版(如Ubuntu) - 重启Docker Desktop和WSL终端,确保网络连接正常
4. 推荐方案:在容器内运行Cron(避免主机/容器网络差异)
直接让Cron在Lando的应用容器内执行,和Web环境共享相同的数据库配置:
- 在项目根目录的
.lando.yml中添加Cron配置:services: appserver: cron: - "*/5 * * * * www-data php /app/yii crawl/run" # 按你的任务频率调整时间规则 - 执行
lando rebuild重启服务,Cron会自动在容器内运行,无需修改任何连接配置
内容的提问来源于stack exchange,提问作者Rosi
相关产品推荐
相关产品推荐

