如何在Azure App Service应用中安装WeasyPrint所需依赖?
问题原因
- GitHub Actions的构建步骤运行在GitHub专属的构建服务器上,安装的系统依赖仅作用于构建环境,不会同步到Azure App Service的运行容器中,所以构建日志显示成功不代表运行环境有对应的依赖。
- Azure App Service Linux 实例基于容器化技术实现,通过SSH手动安装的依赖仅在当前容器实例生命周期内有效,一旦实例重启、缩放或平台触发故障迁移,手动安装的内容会全部丢失。
- 部分情况下系统依赖安装完成后,Python运行环境的共享库搜索路径未包含系统库默认路径,也会导致依赖识别失败。
可行解决方案
方案1:使用自定义启动脚本(快速生效,适合测试/轻量应用)
- 在项目根目录新建
startup.sh文件,写入以下内容:
#!/bin/bash # 更新包索引并安装WeasyPrint所需系统依赖 apt update apt install -y build-essential python3-dev python3-pip python3-setuptools python3-wheel python3-cffi libcairo2 libpango-1.0-0 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 libffi-dev shared-mime-info # 添加系统库路径到环境变量,解决找不到库的问题 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu # 替换为你实际的应用启动命令,比如gunicorn启动flask/django应用 gunicorn --bind=0.0.0.0:8000 your_app.wsgi:application
- 将
startup.sh提交到代码仓库。 - 登录Azure门户,进入对应App Service的「配置」→「常规设置」页面,在「启动命令」输入框填入
bash startup.sh,保存配置后应用会自动重启生效。
方案2:使用自定义Docker镜像(更稳定,适合生产环境)
如果不想每次应用启动都重复安装依赖,可以构建包含所有依赖的自定义Docker镜像部署,步骤如下:
- 在项目根目录新建
Dockerfile,示例内容:
# 基于Azure官方Python镜像,可根据需求替换Python版本 FROM mcr.microsoft.com/appsvc/python:3.9 # 安装系统依赖 RUN apt update && apt install -y --no-install-recommends \ build-essential \ python3-dev \ python3-pip \ python3-setuptools \ python3-wheel \ python3-cffi \ libcairo2 \ libpango-1.0-0 \ libpangocairo-1.0-0 \ libgdk-pixbuf2.0-0 \ libffi-dev \ shared-mime-info \ && apt clean \ && rm -rf /var/lib/apt/lists/* # 设置工作目录 WORKDIR /home/site/wwwroot # 复制依赖文件并安装Python依赖 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 暴露端口 EXPOSE 8000 # 启动命令,替换为实际的应用入口 CMD ["gunicorn", "--bind=0.0.0.0:8000", "your_app.wsgi:application"]
- 将镜像构建并推送到容器镜像仓库(比如Azure Container Registry、Docker Hub)。
- 将App Service的部署源修改为对应的容器镜像即可。
内容的提问来源于stack exchange,提问作者David W. Green
相关产品推荐
相关产品推荐

