添加大依赖包后Azure WebApp生产部署失败求助
解决Azure WebApp部署含deepparse大依赖失败的方案
针对添加deepparse后部署超时/容器重启失败的问题,以下是几个可行的解决思路:
1. 构建包含所有依赖的离线部署包
核心思路是在CI构建阶段完成所有依赖(包括deepparse)的安装,打包时将依赖目录一同加入,避免Azure在线安装耗时过长。
修改Bitbucket的构建步骤:
image: python:3.9 name: Build app with bundled dependencies caches: - pip script: - pip install --upgrade pip # 将所有依赖安装到项目内的python_dependencies目录 - pip install -r requirements.txt --target ./python_dependencies # 创建启动脚本,把依赖目录加入Python路径 - echo '#!/bin/bash' > startup.sh - echo 'export PYTHONPATH="$PYTHONPATH:./python_dependencies"' >> startup.sh - echo 'flask run --host=0.0.0.0 --port=8000' >> startup.sh # 替换为你的实际启动命令 - chmod +x startup.sh - apt-get -y update && apt-get -y install zip # 打包项目文件+依赖目录+启动脚本 - zip -r $BITBUCKET_BUILD_NUMBER.zip . ./python_dependencies startup.sh artifacts: - *.zip
部署后,在Azure WebApp的配置-常规设置里,把启动命令改为./startup.sh,应用会直接使用打包好的依赖,无需在线安装。
2. 改用Docker容器部署
将整个应用打包成Docker镜像,在CI阶段完成依赖安装和镜像构建,推送到Azure容器注册表(ACR)后直接部署到WebApp。这种方式彻底避免了Azure部署时的依赖安装步骤。
示例Dockerfile:
FROM python:3.9-slim WORKDIR /app # 安装deepparse所需的系统依赖(如libgomp) RUN apt-get update && apt-get install -y --no-install-recommends \ libgomp1 \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt . # 使用--no-cache-dir减小镜像体积,加快构建速度 RUN pip install --no-cache-dir -r requirements.txt COPY . . # 设置启动命令 CMD ["flask", "run", "--host=0.0.0.0", "--port=8000"]
在Bitbucket Pipeline中添加镜像构建、推送ACR、部署到WebApp的步骤,替代原有的zip部署流程。
3. 延长Azure容器启动超时(需权限)
如果能获取Azure资源的管理权限,设置WEBSITES_CONTAINER_START_TIME_LIMIT环境变量,给依赖安装足够时间。比如设置为30分钟(1800秒):
az webapp config appsettings set --name <你的WebApp名称> --resource-group <资源组名称> --settings WEBSITES_CONTAINER_START_TIME_LIMIT=1800
也可以在Azure门户的WebApp配置-应用设置中手动添加该变量。
4. 延迟导入deepparse(应急方案)
如果应用并非启动阶段就需要deepparse,可以在代码中延迟导入,避免启动时加载依赖:
# 不在文件顶部导入deepparse def process_address(address_text): # 仅在需要使用时导入 from deepparse import DeepParser parser = DeepParser("en") # 替换为你需要的模型 result = parser(address_text) return result
同时在启动脚本中后台安装deepparse:
# startup.sh pip install deepparse==0.9.9 & flask run --host=0.0.0.0 --port=8000
这种方式适合非核心功能,缺点是第一次调用相关接口时会有延迟。
内容的提问来源于stack exchange,提问作者14mble
相关产品推荐
相关产品推荐

