所以我有一个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
修复了!