Azure App Service(Oryx)未使用自定义启动命令致部署失败
解决Azure App Service部署Django DRF(Pipenv管理依赖)时Oryx自动生成脚本导致依赖缺失的问题
问题根源
- Oryx是Azure App Service默认的构建工具,会自动检测Python项目并生成启动脚本、创建
antenv虚拟环境,但它不支持Pipfile/Pipfile.lock,导致依赖无法正确安装。 - 自定义
startup.sh未生效,是因为Oryx的自动处理逻辑优先级高于自定义启动脚本,只要Oryx检测到Python项目,就会忽略自定义脚本。
解决步骤
1. 禁用Oryx自动构建
在Azure App Service的应用设置中添加配置项:
- 键:
DISABLE_ORYX_BUILD - 值:
true
或者在Azure DevOps的CD部署任务中,通过应用设置参数直接注入该配置,确保部署时自动生效。
2. 编写正确的自定义startup.sh脚本
脚本需要完成pipenv安装、依赖安装、应用启动的完整流程,示例如下:
#!/bin/bash # 升级pip并安装pipenv(若环境未预装) pip install --upgrade pip pip install pipenv # 基于Pipfile.lock安装生产依赖(--deploy确保依赖版本严格匹配) pipenv install --deploy --ignore-pipfile # 启动Django应用(替换为你的项目WSGI模块路径) pipenv run gunicorn --bind=0.0.0.0 --timeout 600 your_project_name.wsgi:application
注意:将
your_project_name.wsgi替换为实际项目的WSGI模块路径,比如myapi.wsgi。
3. 确保startup.sh拥有执行权限
在Azure DevOps的CI流水线中,打包工件前执行以下命令,给脚本添加执行权限:
chmod +x startup.sh
若遗漏此步骤,App Service将无法执行自定义脚本。
4. 指定App Service使用自定义启动脚本
在App Service的配置 > 常规设置中,将启动命令设置为:
./startup.sh
或者在Azure DevOps的CD部署任务(如Azure App Service Deploy)中,在启动命令字段填入上述内容。
验证部署
部署完成后,查看App Service的日志流:
- 确认日志中出现
startup.sh的执行记录 - 检查依赖安装过程无报错
- 确认Django应用正常启动,无
ModuleNotFoundError类错误
内容的提问来源于stack exchange,提问作者Oberwalder Sven
相关产品推荐
相关产品推荐

