Google Cloud功能和共享库

时间:2017-10-09 05:18:58

标签: wkhtmltopdf google-cloud-functions

我试图在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)? 提前谢谢

2 个答案:

答案 0 :(得分:0)

事实上,我已经找到了一种方法来解决这个问题,方法是复制包含wkhtmltopdf二进制文件的同一文件夹(/ bin)中的所有必需库。为了让二进制文件使用上传的库,我将以下行添加到wkhtmltopdf.js: wkhtmltopdf.command =' LD_LIBRARY_PATH =' + path.resolve(__ dirname,' bin')+' ./bin/wkhtmltopdf' ;; wkhtmltopdf.shell =' / bin / bash&#39 ;; module.exports = wkhtmltopdf;

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

答案 1 :(得分:0)

我已经设法让它工作,有两件事需要完成,因为如果出现以下情况,wkhtmltopdf将不起作用:

  • libXrender.so.1无法加载
  • 您正在使用stdout收集生成的pdf。 Wkhtmltopdf必须将结果写入文件

首先,您需要获取libXrender的正确版本 我发现,云端函数使用哪个docker镜像作为nodejs函数的基础。我在本地运行它,安装libxrender并将库复制到我的函数目录中 docker run -it --rm=true -v /tmp/d:/tmp/d gcr.io/google-appengine/nodejs bash
然后,在runing容器内:

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是目录,最后您的函数最终将由google放置):<登记/> process.env['LD_LIBRARY_PATH'] = '/user_code/lib'

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

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