如何在CodeIgniter应用中读取Docker Compose配置的环境变量
我之前在Docker部署CodeIgniter应用时也碰到过一模一样的问题,结合你的配置和踩过的坑,给你几个实用的排查和解决步骤:
1. 先确认环境变量是否真的传入容器
有时候问题根本不在CodeIgniter,而是Docker没把环境变量正确传进去。你可以先进入运行中的容器验证:
# 替换成你的容器名称或ID docker exec -it <your_app_container_name> bash # 在容器内打印环境变量 echo $BASE_URL
如果没有输出http://example.com,那先检查你的docker-compose.yml:
- 确保
environment块里的BASE_URL拼写没有错误 - 执行
docker-compose down && docker-compose up -d重新部署容器,让配置生效
2. 调整PHP的环境变量读取配置
CodeIgniter用getenv()读取环境变量依赖PHP的variables_order配置,默认有些PHP镜像的这个参数没包含E(Environment),导致读不到系统环境变量。
解决方法:
方式一:通过Docker环境变量修改(适合官方PHP镜像)
在你的docker-compose.yml的app服务的environment里新增一行:
- PHP_VARIABLES_ORDER=EGPCS
这个参数会让PHP优先读取环境变量(E),然后是GET、POST、COOKIE、SERVER变量。
方式二:自定义php.ini配置
如果你的镜像不支持上述环境变量,可以挂载一个自定义的php配置文件:
- 在本地创建
php-conf.d/custom.ini,内容:
variables_order = "EGPCS"
- 在docker-compose.yml的
app服务里添加挂载:
volumes: - ./php-conf.d/custom.ini:/usr/local/etc/php/conf.d/custom.ini
3. 修改CodeIgniter的base_url配置
根据你使用的CodeIgniter版本调整:
如果你用的是CodeIgniter 3
打开application/config/config.php,修改base_url的配置:
// 优先读取环境变量,不存在则用默认值 $config['base_url'] = getenv('BASE_URL') ?: 'http://localhost:8080';
如果你用的是CodeIgniter 4
打开app/Config/App.php,修改baseURL:
public $baseURL = getenv('BASE_URL') ?: 'http://localhost:8080';
也可以用$_ENV['BASE_URL']来读取,效果是一样的。
4. 额外检查(针对Apache镜像)
如果你的应用容器用的是Apache作为Web服务器,要确保mod_env模块已经启用,这个模块负责把系统环境变量传递给PHP。大多数官方Apache镜像默认是启用的,但如果是自定义镜像,可以在Dockerfile里添加:
RUN a2enmod env
按这个流程走下来,基本就能解决环境变量读取的问题了。
内容的提问来源于stack exchange,提问作者samrat shakya

