同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
相关产品推荐
相关产品推荐

