在 Linux Web App 上安装 Weasyprint 和 Cairo 时遇到问题

Posted

技术标签:

【中文标题】在 Linux Web App 上安装 Weasyprint 和 Cairo 时遇到问题【英文标题】:Trouble installing Weasyprint & Cairo on Linux Web App 【发布时间】:2021-03-01 00:31:41 【问题描述】:

我有一个使用 Wea​​syprint 生成 PDF 输出的 Django 应用程序。这在我的本地开发机器上运行良好。

我能够成功部署到 Azure Web Apps,但收到以下错误消息:

2020-11-17T07:34:14.287002623Z OSError: no library called "cairo" was found
2020-11-17T07:34:14.287006223Z no library called "libcairo-2" was found
2020-11-17T07:34:14.287009823Z cannot load library 'libcairo.so.2': libcairo.so.2: cannot open shared 
object file: No such file or directory
2020-11-17T07:34:14.287016323Z cannot load library 'libcairo.2.dylib': libcairo.2.dylib: cannot open 
shared object file: No such file or directory
2020-11-17T07:34:14.287020123Z cannot load library 'libcairo-2.dll': libcairo-2.dll: cannot open 
shared object file: No such file or directory

根据 Weasyprint 的文档 (https://weasyprint.readthedocs.io/en/stable/install.html#debian-ubuntu),我尝试通过如下所示的自定义部署脚本进行推荐安装:

jobs:
build:
name: Build and Deploy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2

- name: Set up Python $ env.PYTHON_VERSION 
  uses: actions/setup-python@v2
  with:
    python-version: $ env.PYTHON_VERSION 

- name: Install dependencies
  run: |
    sudo apt-get install 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
    python -m pip install --upgrade pip
    pip install -r requirements.txt

- name: Deploy Web App using GH Action azure/webapps-deploy
  uses: azure/webapps-deploy@v2
  with:
    app-name: $ env.AZURE_WEBAPP_NAME 
    publish-profile: $ secrets.AZURE_WEBAPP_PUBLISH_PROFILE 
    package: $ env.AZURE_WEBAPP_PACKAGE_PATH 

但是,我的问题仍然存在,我仍然收到相同的消息。

有人有在基于 Linux 的 Web 应用程序上安装 Weasyprint 和 Cairo 的经验吗?

感谢您提前提供的任何帮助。

更新

目前,我可以使用 Azure 创建的默认部署脚本进行部署(如下所示)。然后我可以通过 SSH 连接到部署机器并手动激活虚拟环境并安装必要的软件包。此过程有效,我的应用程序现在按预期工作。

我想以某种方式将此命令滚动到部署过程中(作为默认脚本的一部分或通过部署后操作)。

GITHUB 操作部署脚本

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

steps:
- uses: actions/checkout@master

- name: Set up Python version
  uses: actions/setup-python@v1
  with:
    python-version: '3.6'

- name: Build using AppService-Build
  uses: azure/appservice-build@v2
  with:
    platform: python
    platform-version: '3.6'

- name: 'Deploy to Azure Web App'
  uses: azure/webapps-deploy@v2
  with:
    app-name: appname
    slot-name: slotname
    publish-profile: profilename

手动虚拟环境激活和安装

source /home/site/wwwroot/pythonenv3.6/bin/activate
sudo apt-get install  additional packages 

【问题讨论】:

很难说,我会冒险猜测你的本地机器有一个GUI,而你的Azure服务器很可能没有;因此它将缺少cairo 以及可能的其他一些库及其开发对应物......您正在运行哪个版本的 Linux,无论是在您的开发盒还是在您的 azure 实例中? 所以我实际上只是能够通过 SSH 手动解决这个问题到部署机器并手动激活虚拟环境并安装 Weasyprint 文档中推荐的软件包。但是,每次部署新版本时,我都必须重新执行此操作。有没有办法在部署脚本中包含这些依赖项的安装? 您能否在没有任何机密信息和业务的情况下分享您的演示代码。所以我们可以尝试解决它并帮助您。 谢谢杰森。我添加了当前有效的代码并生成了一个有效的应用程序。但是,我想简化这是一个两步流程。 我已经回复了你所有的三个帖子。我已经尝试了所有需要为您使用的方法。你可以尝试自己执行,应该对你有用,如果不行,请提出支持票寻求官方帮助。 【参考方案1】:

需要的依赖和你要安装的东西都可以成功添加到.yml文件中,但是对你的webapp是否生效还需要测试,具体问题需要详细分析。

如果不行,建议手动安装 ssh。

我将 .yml 文件中的 linux 命令添加到 apt-get install xxx

更多详情,

下面是我的.yml 文件。它工作正常。

# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
# More GitHub Actions for Azure: https://github.com/Azure/actions

name: Build and deploy Python app to Azure Web App - pyodbcInstallENV

on:
  push:
    branches:
      - master

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@master

    - name: Set up Python version
      uses: actions/setup-python@v1
      with:
        python-version: '3.8'
    - name: Install custom env
      run: |
        cd /home
        sudo apt-get update
        sudo apt-get install g++
        sudo apt-get install unixodbc-dev
        pip install pyodbc 
    - name: Build using AppService-Build
      uses: azure/appservice-build@v2
      with:
        platform: python
        platform-version: '3.8'

    - name: 'Deploy to Azure Web App'
      uses: azure/webapps-deploy@v2
      with:
        app-name: 'pyodbcInstallENV'
        slot-name: 'production'
        publish-profile: $ secrets.AzureAppService_PublishProfile_d712769***2017c9521 

【讨论】:

以上是关于在 Linux Web App 上安装 Weasyprint 和 Cairo 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

Linux 安装tomcat,搭建web app运行环境

如何将APP部署在阿里云服务器上?

哪个是基于NodeJS的Azure Web App(Linux)上运行的默认Web服务器?

linux上tomcat不断吃内存,web app的问题。

linux部署web App

APP测试和WEB测试区别