Laravel部署AWS Elastic Beanstalk后执行artisan命令报数据库主机数组空错误
Laravel在Beanstalk SSH会话中无法读取环境属性的原因与解决方法
问题原因
AWS Elastic Beanstalk配置的环境属性不会自动注入到SSH登录后的终端会话中:
- 项目正常运行时,Web服务器(Apache/Nginx)的进程由Beanstalk管理启动,此时Beanstalk会自动把环境属性加载到进程的环境变量里,所以Laravel能读取到数据库配置。
- 但SSH登录属于独立的终端会话,这个会话不会自动加载Beanstalk的环境变量,导致
php artisan命令找不到数据库配置,抛出"Database hosts array is empty"错误。
你手动复制项目到EC2能正常执行,是因为当时你大概率已经把必要的配置写入了.env文件,或者会话中已经存在对应的环境变量,和Beanstalk自动部署的环境逻辑不同。
解决方法
1. 手动加载Beanstalk环境变量文件
Beanstalk会把所有环境属性存储在/opt/elasticbeanstalk/deployment/env文件中,执行以下命令加载变量后再运行artisan:
source /opt/elasticbeanstalk/deployment/env && php artisan migrate
如果需要在当前SSH会话中多次执行artisan命令,先单独执行source /opt/elasticbeanstalk/deployment/env,之后整个会话内的命令都能读取到环境变量。
2. 通过Beanstalk CLI执行容器命令(推荐)
用Beanstalk的官方CLI命令直接在容器环境中执行artisan,这种方式会自动加载环境变量,无需手动处理:
eb ssh --command "php artisan migrate"
3. 写入.env文件(不推荐)
应急情况下可以把Beanstalk的环境属性内容复制到Laravel根目录的.env文件中,但这种方式会把数据库密码等敏感信息明文存储,存在安全风险,不建议长期使用。
内容的提问来源于stack exchange,提问作者ashique
相关产品推荐
相关产品推荐

