Azure App Service单仓子目录应用部署成功后启动失败求助
问题分析
从错误日志可以明确两个核心问题:
- 依赖未正确安装:
ModuleNotFoundError: No module named 'uvicorn'说明Azure Web App运行环境中缺少项目依赖包 - 虚拟环境不兼容:构建阶段创建的
venv虚拟环境被排除在部署包外,且Azure Oryx默认寻找名为antenv的虚拟环境,导致无法识别本地构建的环境
结合mono repo(应用位于rest_api子目录)的结构,以下是针对性修复方案:
修复方案
方案一:让Azure自动构建并安装依赖(推荐)
利用Azure Web App的Oryx构建工具自动识别Python项目并安装依赖,同时调整部署包结构适配mono repo:
1. 修改GitHub Actions构建阶段的Artifact上传
将rest_api目录下的内容直接作为artifact根目录,确保部署后Azure的/home/site/wwwroot就是应用目录:
# 替换build阶段的Upload artifact步骤 - name: Upload artifact for deployment jobs uses: actions/upload-artifact@v3 with: name: python-app path: rest_api/ exclude: | venv/
2. 修改部署阶段的Artifact下载
将artifact直接下载到当前目录,保证部署包结构正确:
# 替换deploy阶段的Download artifact步骤 - name: Download artifact from build job uses: actions/download-artifact@v3 with: name: python-app path: .
3. 启用Azure部署时构建
在部署步骤中添加环境变量,触发Oryx自动安装依赖:
- name: 'Deploy to Azure Web App' id: deploy-to-webapp uses: azure/webapps-deploy@v2 with: app-name: ${{ env.AZURE_WEBAPP_NAME }} publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_A79D58476BA645D1BF1A6116201A6E5F }} package: . env: SCM_DO_BUILD_DURING_DEPLOYMENT: true PYTHONPATH: /home/site/wwwroot
方案二:预构建依赖包并随项目部署
如果不想依赖Azure的自动构建,可以在本地构建阶段将依赖安装到Oryx识别的目录:
1. 修改依赖安装命令
将依赖安装到__oryx_packages__目录(Oryx默认读取的依赖目录):
# 替换build阶段的Install dependencies步骤 - name: Install dependencies working-directory: rest_api run: | pip install --upgrade pip pip install -r requirements/base.txt --target="./__oryx_packages__"
2. 上传包含依赖的Artifact
确保__oryx_packages__被包含在部署包中:
- name: Upload artifact for deployment jobs uses: actions/upload-artifact@v3 with: name: python-app path: rest_api/ exclude: | venv/
验证修复
部署完成后查看Azure Web App日志:
- 不再出现
ModuleNotFoundError - 无
Could not find virtual environment directory警告 - 应用正常启动
内容的提问来源于stack exchange,提问作者Wessi
相关产品推荐
相关产品推荐

