AWS CodeDeploy部署EC2时Bash脚本执行失败求助
AWS CodeDeploy部署脚本执行失败问题排查与解决
问题背景
尝试通过AWS CodeDeploy将GitHub上的API服务部署至EC2实例,代码已成功同步到目标目录/home/ec2-user/Gritly-backend-v2,但build.sh脚本执行失败。
相关配置文件
appspec.yml
version: 0.0 os: linux files: - source: / destination: /home/ec2-user/Gritly-backend-v2 hooks: AfterInstall: - location: build.sh timeout: 400 runas: root
build.sh
#!/bin/bash cd /home/ec2-user/Gritly-backend-v2 docker build . -t gritly_backend -f Dockerfile.dev docker stop gritly_backend docker rm gritly_backend docker run -d -p 80:80 --name gritly_backend gritly_backend OUTPUT=$(docker images --filter "dangling=true" -q --no-trunc | wc -l) if [ ${OUTPUT} != 0 ]; then docker rmi $(docker images --filter "dangling=true" -q --no-trunc) fi
错误信息
CodeDeploy执行报错
LifecycleEvent - AfterInstall Script - build.sh [stderr]bash: /opt/codedeploy-agent/deployment-root/4ceeb37e-1874-4290-9e55-a92d655d1558/d-G03KT19HJ/deployment-archive/build.sh: /bin/bash^M: bad interpreter: No such file or directory
手动执行sh build.sh报错
: No such file or directory/ec2-user/Gritly-backend-v2 : no such file or directoryunable to evaluate symlinks in Dockerfile path: lstat /home/ec2-user/Gritly-backend-v2/Dockerfile.dev Error response from daemon: No such container: gritly_backend Error: No such container: gritly_backend docker: invalid reference format. See 'docker run --help'. build.sh: line 8: $'\r': command not found
问题分析与解决
核心原因
脚本采用了Windows风格的CRLF换行符(错误信息中的^M或$'\r'),Linux系统仅支持LF换行符,导致脚本解析失败。
修复步骤
转换本地脚本换行符
- 如果脚本在Windows环境编写,使用文本编辑器将换行符改为LF:
- VS Code:点击右下角
CRLF选项,切换为LF后保存。 - Notepad++:依次点击「编辑」→「文档格式转换」→「转为UNIX格式」。
- VS Code:点击右下角
- 提交修改后的脚本到GitHub,重新触发部署。
- 如果脚本在Windows环境编写,使用文本编辑器将换行符改为LF:
修复EC2实例上已存在的脚本
登录EC2实例,执行命令转换换行符并添加执行权限:sed -i 's/\r$//' /home/ec2-user/Gritly-backend-v2/build.sh chmod +x /home/ec2-user/Gritly-backend-v2/build.sh优化脚本容错性
修改build.sh中容器操作部分,避免容器不存在时脚本中断:docker stop gritly_backend || true docker rm gritly_backend || true
内容的提问来源于stack exchange,提问作者Mohamed Anser Ali
相关产品推荐
相关产品推荐

