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

同Docker网络容器调用Moodle Web Service报错排查

问题根因

两个报错均由moodle-docker默认的测试环境配置触发:

  • Postman外部访问正常,是因为请求的Host头为localhost:8000,不触发测试路由规则,走正常业务逻辑返回200。
  • 容器内首次调用返回403,是因为默认配置中$CFG->behat_wwwroot值为http://webserver,当容器内用webserver作为域名访问时,Host头刚好匹配Behat测试域名规则,Moodle自动切换到Behat测试运行模式,该模式不会加载生产环境的Web Service配置,因此提示Web Service/REST协议未启用。
  • 重启后返回Behat未安装提示,是因为重启后环境变量加载顺序变化,Moodle识别到请求匹配Behat域名但未初始化Behat测试环境,直接抛出测试环境初始化提示,未走到正常Web Service处理逻辑。
配置步骤

按以下操作修改后即可同时支持外部localhost访问、同网络容器用webserver别名正常调用Web Service:

  • 修改moodle-docker目录下的config.docker-template.php文件,调整Behat测试域名,避免和内部访问别名冲突:
// 注释或修改原默认配置
// $CFG->behat_wwwroot = 'http://webserver';
// 修改为专属测试域名,不与业务访问域名重合
$CFG->behat_wwwroot = 'http://behat.moodle.local';
  • 打开moodle-docker目录下的环境变量配置文件(通常为.env),添加配置关闭默认开启的测试模式开关:
MOODLE_BEHAT_ENABLED=0
MOODLE_PHPUNIT_ENABLED=0
  • 保留已有的跨网络配置:无需修改Moodle容器的webserver服务别名,无需调整业务容器接入network_name桥接网络的配置。
  • 重建Moodle容器使配置生效:
docker compose down
docker compose up -d
验证方式
  • 外部访问验证:用原有Postman请求调用http://localhost:8000对应的Web Service接口,确认正常返回用户数据。
  • 容器内访问验证:进入Node.js业务容器,执行之前的curl命令调用http://webserver对应的Web Service接口,确认不再返回403或Behat安装提示,正常返回JSON格式的用户数据。

后续如果需要运行Behat自动化测试,只需临时将MOODLE_BEHAT_ENABLED改回1,通过配置的专属测试域名访问即可,不会影响正常业务接口的调用。

内容的提问来源于stack exchange,提问作者rixpl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:12:17