Heroku Node.js应用运行Main可执行文件缺失libffi.so.6如何解决?
解决方案
你提到的通过.profile下载依赖的方案完全可行,Heroku的/app目录为应用专属可写目录,不受只读权限限制,以下是3种可落地的解决方法:
方案1:.profile脚本动态挂载依赖
在项目根目录新建名为.profile的文件,Heroku实例启动时会自动执行该文件的脚本,配置内容如下:
# 创建本地依赖存储目录 mkdir -p /app/.local/lib # 仅在依赖不存在时执行下载逻辑 if [ ! -f /app/.local/lib/libffi.so.6 ]; then # 下载对应架构的libffi6安装包 curl -sL http://archive.ubuntu.com/ubuntu/pool/main/libf/libffi/libffi6_3.2.1-8_amd64.deb -o /tmp/libffi6.deb # 解压安装包提取动态库文件 dpkg -x /tmp/libffi6.deb /tmp/libffi6 cp /tmp/libffi6/usr/lib/x86_64-linux-gnu/libffi.so.6 /app/.local/lib/ fi # 将本地依赖目录加入系统动态库搜索路径 export LD_LIBRARY_PATH=/app/.local/lib:$LD_LIBRARY_PATH
将该文件提交到代码仓库后重新部署即可生效。
方案2:使用apt buildpack安装系统依赖
通过Heroku官方维护的apt buildpack可以直接安装缺失的系统包,操作步骤:
- 执行命令添加apt buildpack:
heroku buildpacks:add --index 1 heroku-community/apt -a 你的应用名 - 在项目根目录新建名为
Aptfile的文件,写入内容:libffi6 - 提交文件重新部署即可。
方案3:静态编译Main可执行文件(最优选择,若持有源码)
如果Main是你自行编译的可执行文件,编译时添加静态编译参数,将所有依赖打包到二进制文件中,就不需要依赖系统动态库,从根源解决问题。以C语言编译为例,添加-static参数即可:gcc -static -o Main Main.c
额外注意事项
你当前的调用代码存在两处可优化点:
- 确保代码中的
timeout变量已提前定义,否则会触发变量未定义报错 - 目前仅捕获了stdout输出,建议新增stderr的捕获逻辑,方便后续排错:可在返回值中新增
child.stderr.toString()的判断,存在错误内容时优先返回错误信息。
内容的提问来源于stack exchange,提问作者Nino Pedergnana
相关产品推荐
相关产品推荐

