【问题标题】:Google Cloud Functions and shared libraries谷歌云函数和共享库
【发布时间】:2017-10-09 05:18:57
【问题描述】:

我正在尝试在 GCF 上使用 wkhtmltopdf 生成 PDF。 当我的函数尝试生成子进程时,我收到以下错误:

Error: ./services/wkhtmltopdf: error while loading shared libraries: libXrender.so.1: cannot open shared object file: No such file or director

问题显然是因为 wkhtmltopdf 二进制文件依赖于外部共享库,而这些共享库没有安装在 GCF 环境中。

有没有办法解决这个问题,还是我应该放弃并使用其他解决方案(AWS Lambda o GAE)? 提前谢谢你

【问题讨论】:

  • 我面临着完全相同的问题。据我所知,目前在 GCF 环境中除了 JS 之外没有其他方法可以执行。
  • 同样适用于 Microsoft Azure Functions...
  • 嘿,我也很想这样做,你能在 GitHub 上发布你的解决方案吗?

标签: wkhtmltopdf google-cloud-functions


【解决方案1】:

确实,我找到了解决此问题的方法,方法是将所有必需的库复制到包含 wkhtmltopdf 二进制文件的同一文件夹(我是 /bin)中。为了让二进制文件使用上传的库,我在 wkhtmltopdf.js 中添加了以下几行: wkhtmltopdf.command = 'LD_LIBRARY_PATH='+path.resolve(__dirname, 'bin')+' ./bin/wkhtmltopdf'; wkhtmltopdf.shell = '/bin/bash'; module.exports = wkhtmltopdf;

在一段时间内一切正常。突然间,我收到许多来自 GCF 或超时的连接错误,但我认为这与我的实现无关,而是与 Google 有关。 我最终设置了一个专用服务器。

【讨论】:

    【解决方案2】:

    我已经设法让它工作了,有两件事需要做,因为 wkhtmltopdf 在以下情况下将无法工作:

    • libXrender.so.1无法加载
    • 您正在使用标准输出来收集生成的 pdf。 wkhtmltopdf 必须将结果写入文件

    首先你需要获得libXrender的正确版本。
    我发现,哪些 docker image Cloud 函数正在用作 nodejs 函数的基础。我已经在本地运行它,安装了 libxrender 并将库复制到我的函数目录中。
    docker run -it --rm=true -v /tmp/d:/tmp/d gcr.io/google-appengine/nodejs bash
    然后,在运行容器内:

    apt update
    apt install libxrender1
    cp /usr/lib/x86_64-linux-gnu/libXrender.so.1 /tmp/d
    

    我已经把它放到我函数的项目目录和lib 子目录下。在我的函数的源文件中,然后我设置LD_LIBRARY_PATH 以包含/user_code/lib 目录(/user_code 是目录,最后你的函数最终将被谷歌放置):
    process.env['LD_LIBRARY_PATH'] = '/user_code/lib'

    这足以让 wkhtmltopdf 能够执行。它会失败,因为它无法写入标准输出,并且函数最终会超时并被杀死(正如 Matteo 所经历的那样)。我认为这是因为谷歌在没有 tty 的情况下运行容器(只是推测),如果我使用 docker run -it 标志运行它,我可以在他们的容器中运行我的代码。为了解决这个问题,我正在调用 wkhtmltopdf 以便它将输出写入/tmp 下的文件(这是内存中的 tmpfs)。然后我读回文件并将其作为我的响应正文发送。请注意,tmpfs 可能会在函数调用之间重复使用,因此您每次都需要使用唯一文件。

    这似乎可以解决问题,我可以将 wkhtmltopdf 作为 Google CloudFunction 运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 2019-08-16
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多