我试图在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)? 提前谢谢
答案 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
无法加载首先,您需要获取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运行。