Laravel部署于EB时postdeploy脚本调用get-config写入文件为空
故障根因
脚本无写入内容是Shell重定向逻辑写错导致的,具体问题点:
- 核心错误:
echo命令的所有输出(包含你要写入文件的RDS_HOSTNAME内容)被>> /dev/null 2>&1重定向规则全部送入空设备丢弃,管道符左侧没有任何输出流传递给右侧的sudo tee命令,tee拿不到待写入内容,自然生成空文件。 - 逻辑偏差:原写法的引号拼接逻辑本身没有问题,但管道重定向的位置完全放错,属于对Shell重定向、管道的数据流向理解有误。
- 验证结论:手动登录实例执行get-config能拿到正常值,说明工具本身权限、RDS配置下发逻辑完全正常,不需要排查EB环境本身的配置问题。
修复方案
替换my_script.sh内容为以下版本即可:
#!/bin/sh # 读取EB环境中的RDS主机名配置 host_name=$(/opt/elasticbeanstalk/bin/get-config environment -k RDS_HOSTNAME) # 将配置写入目标文件,末尾的>/dev/null仅屏蔽tee命令默认的控制台打印输出,不影响文件写入 echo "RDS_HOSTNAME=\"${host_name}\"" | sudo tee /var/app/current/aws.env.tmp.config > /dev/null
部署注意事项
- 提交代码前务必给脚本添加可执行权限:执行
chmod +x .platform/hooks/postdeploy/my_script.sh,否则EB部署时会因无执行权限跳过该钩子。 - 上述脚本默认每次部署覆盖写入目标配置文件,如果你需要追加多个配置项,可以把
tee改为tee -a开启追加模式;如果是写多组配置,建议脚本开头先加sudo rm -f /var/app/current/aws.env.tmp.config清空旧文件,避免重复部署产生重复配置行。
内容的提问来源于stack exchange,提问作者joshi
相关产品推荐
相关产品推荐

