启用WEBSITE_RUN_FROM_PACKAGE=1时Azure Python应用部署模块报错
问题分析与解决方案
核心冲突点
启用WEBSITE_RUN_FROM_PACKAGE = 1后,你同时配置了ENABLE_ORYX_BUILD = 1和SCM_DO_BUILD_DURING_DEPLOYMENT = 1,这三个设置存在本质冲突:
WEBSITE_RUN_FROM_PACKAGE让App Service从只读压缩包直接运行应用,不允许部署时写入任何文件- 后两个设置要求App Service在部署阶段执行Oryx构建(安装依赖、编译代码等),但只读包环境无法完成写入操作,导致依赖未被正确加载,引发模块找不到的错误
具体修复步骤
1. 移除冲突的应用设置
修改Terraform配置中的app_settings,删除ENABLE_ORYX_BUILD和SCM_DO_BUILD_DURING_DEPLOYMENT:
app_settings = { WEBSITE_RUN_FROM_PACKAGE = 1 AZURE_STORAGE_CONNECTION_STRING = ".." OPENAI_API_KEY = "..." BACKEND_URL = "..." FRONTEND_HOST = ".." APPLICATION_INSIGHTS_CONNECTIONSTRING = ".." DEFAULT_MAX_CONTEXT_LEN = 1200 DEFAULT_MAX_TOKENS = 200 MAX_EMBEDDING_CHUNK_TOKENS = 200 }
2. 确保Python能识别依赖路径
你的构建步骤已将依赖安装到./.python_packages/lib/site-packages,需让Python运行时能找到这个目录。修改Terraform中的app_command_line,添加PYTHONPATH环境变量指定依赖路径:
app_command_line = "PYTHONPATH=./.python_packages/lib/site-packages gunicorn --preload --bind 0.0.0.0:8000 --workers=4 --timeout 600 app:app"
3. 验证打包内容完整性
确认ArchiveFiles任务正确包含.python_packages目录:
- 检查生成的zip包,确保根目录下存在
.python_packages文件夹,且内部包含所有安装的依赖模块 - 若打包时遗漏该目录,调整
ArchiveFiles的rootFolderOrFile或includeRootFolder参数,确保依赖目录被包含
4. 可选:改用虚拟环境打包(更稳定)
如果上述方法仍有问题,可调整构建流水线,将虚拟环境一起打包:
修改构建脚本:
python -m venv antenv source antenv/bin/activate python -m pip install --upgrade pip pip install setup pip install -r ./requirements.txt
然后修改启动命令(Terraform中):
app_command_line = "source antenv/bin/activate && gunicorn --preload --bind 0.0.0.0:8000 --workers=4 --timeout 600 app:app"
注意:打包时需确保antenv目录被包含在zip包中,Linux环境下脚本的可执行权限会被Azure DevOps的ArchiveFiles任务默认保留
验证效果
修改配置后重新部署:
- 检查Kudu日志,确认模块导入错误消失
- 部署时间应大幅缩短(跳过了部署阶段的Oryx构建,直接运行预打包的应用)
内容的提问来源于stack exchange,提问作者Redduke
相关产品推荐
相关产品推荐

