EC2上CodeDeploy的appspec.yml与控制台pip执行行为不一致排查
问题排查与解决方案
核心问题:相对路径导致虚拟环境激活失效
CodeDeploy执行Hook脚本时的工作目录并非/home/ec2-user,而是部署包的临时解压目录(例如/opt/codedeploy-agent/deployment-root/<部署组ID>/<部署ID>/deployment-archive)。你的脚本中使用source venv/bin/activate这种相对路径,会尝试加载当前工作目录下的venv,而非/home/ec2-user下的目标虚拟环境——这就是手动执行正常、但CodeDeploy执行时包未更新的根本原因。
具体修复方案
1. 用绝对路径激活虚拟环境
修改start_server脚本中的激活命令,指定虚拟环境的完整路径:
source /home/ec2-user/venv/bin/activate cd /home/ec2-user pip install -r requirements.txt
2. 更可靠的方式:直接调用虚拟环境的pip
跳过source激活步骤,直接使用虚拟环境内的pip绝对路径执行安装,彻底避免环境变量加载问题:
/home/ec2-user/venv/bin/pip install -r /home/ec2-user/requirements.txt
3. 添加日志排查隐藏问题(可选)
在脚本中加入日志输出,方便查看CodeDeploy执行时的上下文细节:
echo "当前工作目录: $(pwd)" >> /home/ec2-user/deploy_debug.log echo "使用的Python路径: $(which python)" >> /home/ec2-user/deploy_debug.log echo "使用的pip路径: $(which pip)" >> /home/ec2-user/deploy_debug.log pip install -r requirements.txt -v >> /home/ec2-user/deploy_debug.log 2>&1
部署完成后查看/home/ec2-user/deploy_debug.log,可确认pip安装的完整过程和是否存在隐藏报错。
额外验证点
- 确认
/home/ec2-user/venv目录的所有者为ec2-user,权限设置为755,避免CodeDeploy执行时无权限访问。 - 检查CodeDeploy代理日志(
/var/log/aws/codedeploy-agent/codedeploy-agent.log),查看脚本执行阶段是否有报错信息。
内容的提问来源于stack exchange,提问作者Pring
相关产品推荐
相关产品推荐

