Moodle配置文件使用docker env



所以我有一个docker图像为moodle,它包括一个config.php文件,可以"自动";连接到它的数据库

<?php  // Moodle configuration file
unset($CFG);
global $CFG;
$CFG = new stdClass();
$CFG->dbtype    = 'pgsql';
$CFG->dblibrary = 'native';
$CFG->dbhost    = 'db';
$CFG->dbname    = getenv('MOODLE_DB_NAME');
$CFG->dbuser    = getenv('MOODLE_DB_USER');
$CFG->dbpass    = getenv('MOODLE_DB_PASSWORD');
$CFG->prefix    = 'mdl_';
$CFG->dboptions = array (
'dbpersist' => 0,
'dbport' => '',
'dbsocket' => '',
);
$CFG->wwwroot   = getenv('MOODLE_WWW_ROOT');
$CFG->dataroot  = getenv('MOODLE_DATA_ROOT');
...

如果我用一个字符串替换所有这些,一切似乎都工作得很好。然而,拥有一个只有明文凭证的文件是一个非常明显的安全问题,并且试图使用getenv(),$_ENV[]$_SERVER[]似乎会抛出这个错误:

错误:数据库连接失败

可能是数据库过载或无法正常运行。

站点管理员还应该检查在config.php

中是否正确指定了数据库详细信息。

我已经确认所有这些ENV变量确实存在,甚至已经将它们硬编码在dockerfile中。

示例:ENV MOODLE_DB_PASSWORD=pass

此外,运行docker moodle-container env显示所有这些变量确实存在,并且有值。

我错过了什么?

TLDR:当我尝试使用getenv()而不是硬编码字符串,moodle不能再连接到我的DB,我不确定为什么。

编辑@Russel England建议我打开错误报告后,我现在有一个额外的错误信息:

警告:未定义属性:stdClass::$lang in/var/www/html/lib/weblib.php on line 2239

编辑2:通过终端输出解析后,我还得到以下错误(尝试登录服务器时未在UI中显示)

pg_connect(): cannot connect to PostgreSQL server: FATAL: password authentication failed for user" appuser"在/var/www/html/lib/dml/pgsql_native_moodle_database.php第197行

这个错误弹出,即使当我硬编码密码(在Dockerfile),只有当所有的变量都硬编码为字符串(在php文件)而不是getenv()调用时才会消失。

$是干什么用的?是不是只有getenv('MOODLE_DB_NAME');?

也可以回显值,看看它们包含什么

和/或切换调试到开发模式

// Force a debugging mode regardless the settings in the site administration
@error_reporting(E_ALL | E_STRICT); // NOT FOR PRODUCTION SERVERS!
@ini_set('display_errors', '1');    // NOT FOR PRODUCTION SERVERS!
$CFG->debug = (E_ALL | E_STRICT);   // === DEBUG_DEVELOPER - NOT FOR PRODUCTION SERVERS!
$CFG->debugdisplay = 1;             // NOT FOR PRODUCTION SERVERS!

查看php-fpm配置

; Clear environment in FPM workers
; Prevents arbitrary environment variables from reaching FPM worker processes
; by clearing the environment in workers before env vars specified in this
; pool configuration are added.
; Setting to "no" will make all environment variables available to PHP code
; via getenv(), $_ENV and $_SERVER.
; Default Value: yes
;clear_env = no

uncommentclear_env = no修复了!

最新更新