Docker Compose环境变量无法传递给CodeIgniter 4,如何解决?
解决Docker Compose环境变量传递到CodeIgniter 4的问题
核心问题根源
CodeIgniter 4启动时会优先加载项目根目录的.env文件,里面的硬编码配置会直接覆盖系统环境变量(包括Docker传入的变量)。另外如果PHP配置的variables_order参数未包含E,环境变量也不会出现在$_SERVER或$_ENV数组中。
分步解决方案
1. 修改.env文件,优先读取系统环境变量
把数据库相关配置改成从环境变量动态取值,示例如下:
database.default.hostname = ${DB_HOST} database.default.database = ${DB_NAME} database.default.username = ${DB_USER} database.default.password = ${DB_PASS} database.default.DBDriver = MySQLi
如果需要默认值兜底,可以写成${DB_HOST:localhost}的格式,当Docker未传入该变量时自动使用默认值。
2. 确保PHP配置允许读取环境变量
在Dockerfile中添加配置,强制PHP的variables_order包含E(代表Environment):
RUN echo "variables_order = \"EGPCS\"" >> /usr/local/etc/php/php.ini
EGPCS是PHP标准变量顺序,但部分自定义镜像可能被修改,添加此配置可确保环境变量被加载到$_SERVER和$_ENV中。
3. 正确配置docker-compose.yml的环境变量
确保环境变量直接传递到容器,避免与本地.env文件冲突:
services: app: build: . environment: - DB_HOST=你的生产数据库地址 - DB_NAME=你的数据库名 - DB_USER=数据库用户名 - DB_PASS=数据库密码 ports: - "8080:80"
不要同时使用env_file和environment字段,避免变量覆盖。
4. 禁止将本地.env文件复制到镜像
如果你的Dockerfile中有COPY .env .指令,会把本地的.env文件复制到容器内,直接覆盖Docker传入的环境变量。请删除这行指令,或者在容器启动时用示例文件替换:
services: app: # 其他配置... command: sh -c "cp .env.example .env && php spark serve --host 0.0.0.0"
用.env.example作为模板,确保容器启动时优先使用Docker传入的环境变量。
5. 验证环境变量是否生效
在CodeIgniter控制器中添加调试代码,确认变量是否被正确读取:
var_dump($_ENV['DB_HOST'], getenv('DB_HOST')); die;
如果输出Docker设置的数值,说明传递成功;若仍显示默认值,检查.env文件的变量引用格式是否正确。
额外注意事项
- 注意:CodeIgniter 4要求PHP版本至少7.4,但你目标服务器的PHP版本是5.6,这会导致容器内的CodeIgniter 4无法运行。你需要调整容器的PHP版本,或确认是否误将CodeIgniter 3项目当成了CodeIgniter 4(PHP 5.6仅支持CodeIgniter 3)。
- MariaDB 10.1.41与CodeIgniter 4的MySQLi驱动兼容性正常,确保数据库配置中的
DBDriver设置为MySQLi而非MySQL。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

