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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:40:32