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

Docker部署Moodle时getenv()读取环境变量致数据库连接失败排查

问题排查与解决方案

1. 优先确认环境变量的实际值是否匹配预期

终端明确提示pg_connect(): Unable to connect to PostgreSQL server: FATAL: password authentication failed for user "appuser",说明通过环境变量读取的密码和数据库实际密码不一致,这是核心问题:

  • 进入容器执行命令,直接打印环境变量的密码值:
    docker exec moodle-container echo $MOODLE_DB_PASS
    
  • 将输出结果和你硬编码在config.php里的密码对比,如果不一致,说明Dockerfile设置环境变量时存在问题:
    • 若密码包含特殊字符(如$、!、@),Dockerfile的ENV指令会解析变量替换,比如密码是pass$word,直接写ENV MOODLE_DB_PASS pass$word会导致$word被解析为空,实际密码变成pass。解决方法是用反斜杠转义特殊字符:
      ENV MOODLE_DB_PASS pass\$word
      

2. 检查PHP是否能正确读取环境变量

即使容器内环境变量存在,PHP的配置可能限制了环境变量的读取:

  • 在config.php的数据库配置代码前添加调试代码,查看环境变量的实际读取结果:
    var_dump(getenv('MOODLE_DB_NAME'), getenv('MOODLE_DB_USER'), getenv('MOODLE_DB_PASS'));
    exit;
    
  • 访问Moodle页面,查看输出的变量值是否正确:
    • 如果输出bool(false),说明PHP无法读取环境变量,检查php.ini中的variables_order配置,确保包含E(环境变量):
      variables_order = "EGPCS"
      
    • 修改后重启容器内的PHP服务,或者重新构建镜像。

3. 排除Moodle初始化流程的干扰

  • 确保config.php中读取环境变量的代码在Moodle核心初始化代码之前执行,避免因初始化流程导致变量读取时机错误。
  • 清除Moodle的缓存(如果有),避免旧的配置缓存影响新的环境变量读取。

关于Undefined property: stdClass::$lang警告

这个警告是数据库连接失败的后续连锁错误:Moodle无法连接数据库时,无法加载语言配置文件,导致lang属性未定义。解决数据库连接问题后,这个警告会自动消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:20:22