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

