AWS Elastic Beanstalk Linux2平台predeploy钩子克隆文件失效求助
问题
在Linux 2平台运行AWS Elastic Beanstalk应用时,部署阶段需要克隆GitHub仓库获取应用配置文件,于是创建了/.platform/hooks/predeploy/01_import钩子脚本,想让应用启动前文件就准备好。但部署后发现:
- predeploy钩子确实执行了(日志里能看到echo输出)
/var/app/current/config目录下找不到克隆的文件- 把完全一样的脚本放到postdeploy钩子里,文件就能正常生成
脚本内容如下:
#!/bin/bash mkdir /var/app/current/config echo Adding github in known hosts ssh-keyscan -H github.com >> /home/webapp/.ssh/known_hosts echo Done Adding github in known hosts echo deleting old flows echo cloning git -c core.sshCommand="ssh -i /etc/pki/tls/certs/githubKey" clone -b dev --single-branch <mygithub> /var/app/current/config echo done cloning
原因分析
AWS Elastic Beanstalk Linux 2平台的部署流程里,predeploy钩子的执行时机是应用版本解压到临时目录后,但还没把这个目录替换成/var/app/current之前。这时候你操作的/var/app/current其实是上一个版本的目录,等部署完成,新的/var/app/current会被替换成临时解压的目录,之前克隆的文件自然就被覆盖掉了,所以最终看不到。
而postdeploy钩子是在Elastic Beanstalk完成应用版本部署(也就是/var/app/current已经更新为新版本目录)之后执行的,这时候修改/var/app/current里的内容不会被后续流程覆盖,所以文件能正常保留。
解决方案
如果必须在应用启动前完成配置文件克隆,别直接操作/var/app/current,而是操作Elastic Beanstalk的临时部署目录。这个目录的路径可以通过环境变量$EB_APP_STAGING_DIR获取,修改后的脚本如下:
#!/bin/bash # 操作临时部署目录,而非/var/app/current TARGET_DIR="$EB_APP_STAGING_DIR/config" mkdir -p "$TARGET_DIR" echo Adding github in known hosts ssh-keyscan -H github.com >> /home/webapp/.ssh/known_hosts echo Done Adding github in known hosts echo cloning git -c core.sshCommand="ssh -i /etc/pki/tls/certs/githubKey" clone -b dev --single-branch <mygithub> "$TARGET_DIR" echo done cloning
这样在predeploy钩子中把文件克隆到临时目录,后续部署流程会把这个临时目录的内容同步到/var/app/current,应用启动时就能看到配置文件了。
内容的提问来源于stack exchange,提问作者Ben79543
相关产品推荐
相关产品推荐

