背景

最近在处理线上工单的时候,遇到一个用户使用 nodejs runtime 时因为函数计算运行环境的 gcc 版本过低导致无法运行的问题,觉得非常有意思,所以深入的帮用户寻找了解决方案。觉得这个场景应该具有一定的通用性,所以在这篇文章里面重点的介绍一下如何使用函数计算的周边工具 fun 解决因为 runtime 中系统版本导致的各种兼容性问题。

场景介绍

用户问题

简要描述一下用户当时遇到的问题:

用户使用函数计算的 nodejs8 runtime,在本地自己的开发环境使用 npm install couchbase 安装了 couchbase 这个第三方库。couchbase 封装了 C 库,依赖系统底层动态链接库 libstdc++.so.6。因为用户自己的开发环境的操作系统内核比较新,所以本地安装、编译和调试都比较顺利。所以,最后按照函数计算的打包方式成功创建了 Function,但是执行 InvokeFunction 时,遇到了这样的错误:

"errorMessage": "/usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /code/node_modules/couchbase/build/Release/couchbase_impl.node)","errorType": "Error","stackTrace": ["Error: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /code/node_modules/couchbase/build/Release/couchbase_impl.node)",
...

错误发生的原因如堆栈描述,即没有 CXXABI_1.3.9 这个版本,可以看到函数计算 nodejs 环境中的支持情况:

root@1fe79eb58dbd:/code# strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 |grep CXXABI_
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_1.3.8
CXXABI_TM_1

升级底层系统版本的代价比较大,需要长时间的稳定性、兼容性测试和观察,所以,为了支持这类使用场景,我们希望能够有比较简单的方式绕行。

场景复现和问题解决

前提:先按照 fun 的安装步骤安装 fun工具,并进行 fun config 配置。

在本地很快搭建了一个项目目录:

- test_code/- index.js- template.yml

其中 index.js 和 template.yml 的 内容分别为

# index.js
const couchbase = require('couchbase').Mock;module.exports.handler = function(event, context, callback) {var cluster = new couchbase.Cluster();var bucket = cluster.openBucket();bucket.upsert('testdoc', {name:'Frank'}, function(err, result) {if (err) throw err;bucket.get('testdoc', function(err, result) {if (err) throw err;console.log(result.value);// {name: Frank}});});callback(null, {hello: 'world'})
}# template.yml
ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:fc: # service nameType: 'Aliyun::Serverless::Service'Properties:Description: 'fc test'helloworld: # function nameType: 'Aliyun::Serverless::Function'Properties:Handler: index.handlerRuntime: nodejs8CodeUri: './'Timeout: 60

为了能够在本地模拟函数计算的真实环境进行依赖包安装和调试,这里生成一个 fun.yml 文件用于 fun install 安装使用,内容如下:

runtime: nodejs8
tasks: - shell: |-if [ ! -f /code/.fun/root/usr/lib/x86_64-linux-gnu/libstdc++.so.6 ]; thenmkdir -p /code/.fun/tmp/archives/curl http://mirrors.ustc.edu.cn/debian/pool/main/g/gcc-6/libstdc++6_6.3.0-18+deb9u1_amd64.deb -o /code/.fun/tmp/archives/libstdc++6_6.3.0-18+deb9u1_amd64.debbash -c 'for f in $(ls /code/.fun/tmp/archives/*.deb); do dpkg -x $f /code/.fun/root; done;'rm -rf /code/.fun/tmp/archivesfi  - name: install couchbaseshell: npm install couchbase

fun.yml中参数说明:

  • 前面的分析已经了解到函数计算 nodejs8 runtime 的 libstdc++.so.6 的版本偏低,所以,我们找到一个更新的版本来支持,见新版本的 libstdc++.so.6 的 CXXABI_ 参数:
$strings .fun/root/usr/lib/x86_64-linux-gnu/libstdc++.so.6|grep CXXABI_
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_1.3.8
CXXABI_1.3.9
CXXABI_1.3.10
CXXABI_TM_1
CXXABI_FLOAT128

执行 fun install 命令

安装各种第三方依赖,显示如下:

本地执行情况

执行 fun local invoke helloworld,可以看到执行成功的效果:

$fun local invoke helloworld
begin pullling image aliyunfc/runtime-nodejs8:1.4.0...............................................................
pull image finishedpull image finished
FC Invoke Start RequestId: 78e20963-b314-4d69-843a-35a3f465796c
load code for handler:index.handler
FC Invoke End RequestId: 78e20963-b314-4d69-843a-35a3f465796c
{"hello":"world"}2019-02-19T08:16:45.073Z 78e20963-b314-4d69-843a-35a3f465796c [verbose] { name: 'Frank' }

发布上线

使用 fun deploy 发布上线,然后到控制台执行一下线上实际的运行效果:

总结

fun install 功能能够将代码和依赖文件分离开,独立安装系统依赖文件,而且 fun local 和 fun deply 都能够自动帮你设置第三方库的依赖引用路径,让您无需关心环境变量问题。

本文的解法只是提供了一个对于系统版本偏低无法满足用户一些高级库使用需求时的简单绕行方案,仅供参考,对于一些复杂的环境依赖问题,可能还需要具体情况具体分析。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

函数运行环境系统动态链接库版本太低?函数计算 fun 神助力分忧解难相关推荐

  1. android opengl版本太低,安卓模拟器opengl_安卓模拟器无法安装“系统opengl版本过低”的通用解决方法_安卓模拟器通用版_通用安卓模拟器...

    安卓模拟器无法安装"系统opengl版本过低"的通用解决方法 在安装安卓模拟器时,出现"系统opengl版本过低",下图提示,说明你的显卡暂不支持模拟器: 遇到 ...

  2. 苹果系统怎么降低版本_海信电视系统版本太低怎么升级?

    和智能手机一样,智能电视也在不断的升级当中,配置的更新换代,使得价格也在慢慢的降低,而智能电视更多的价值,开始在系统和内容上慢慢的实现,但是现在智能电视有一个问题,就是电视版本有一些低了,这种情况怎么 ...

  3. 按装oracle后 eclips提示jvm版本太低的问题

    分类: 数据库 J2EE(各种框架技术) 2009-05-05 17:40 445人阅读 评论(0) 收藏 举报 经常见论坛上有朋友遇到这个问题 安装了 oracle 再启动eclipse的时候,提示 ...

  4. linux qq 提示错误,linux QQ使用实践兼wine QQ2013版本太低无法使用解决办法

    摘要一部分:+-----------------------------------------------------------------------+ 安装说明: +------------- ...

  5. android opengl版本,安卓模拟器无法安装系统opengl版本过低的通用解决方法

    在安装安卓模拟器时,出现"系统opengl版本过低",下图提示,说明你的显卡暂不支持模拟器: 遇到这个问题,主要是3种原因 1.你的电脑没有显卡 解决方案:这个问题若不换电脑硬件是 ...

  6. AppNinja一文解决:targetSdkVersion版本过低安装失败,安装apk提示版本太低,targetsdkversion修改方法,附带打包修改工具

    解决targetSdkVersion版本过低安装失败,安装apk提示版本太低,targetsdkversion修改方法 直接上解决办法: 一.打包错误 AndroidManifest.xml:1: e ...

  7. yum更新php版本,yum php版本太低怎么办

    yum php版本太低的解决办法:首先检查当前安装的PHP包并删除:然后更换rpm源:接着运行"yum install":最后安装PHP FPM即可. 推荐:<PHP视频教程 ...

  8. Win10版本太低更新不了怎么办

    Win10版本太低更新不了怎么办?很多朋友的电脑一直没有更新,就这么用着,后来才听说老是不更新不安全,所以开始想要进行更新,可是版本太低了,微软已经停止服务了,这种时候系统还没办法进行更新可怎么办. ...

  9. Manjaro通过deepin/Arch库安装Tim出现版本太低无法登录问题[解决]

    最近装了Manjaro系统后,安装Tim/QQ时出现版本太低无法登录都问题,找了很多解决办法,都行不通,在这里总结一下 1.安装Tim 主流Manjaro安装tim/QQ的方法为: //Tim安装 y ...

最新文章

  1. WCF for .NET CF的一个应用及两个困惑的问题
  2. 【Guava】使用Guava的RateLimiter做限流
  3. SpringBoot24 SpringDataJPA环境搭建、实体类注解、关联查询
  4. 软件测试 -- 元素定位
  5. findbugs插件_提升编码效率的IntelliJ IDEA必备插件
  6. 构造函数、拷贝构造函数和析构函数的的调用时刻及调用顺序
  7. leetcode 169. 多数元素(不同数相消解法)
  8. 如何不用 List.clear() 方法 就清空 list 中的 所有元素(中兴面试)
  9. vue的模糊查询和下拉菜单修改信息------------学习记录
  10. 《JavaScript高效图形编程(修订版)》——6.7 画布绘制基础
  11. sql 从ip列表中查询ip段_IP地址段查询深度优化案例
  12. LintCode刷题——打劫房屋I、II、III
  13. 计算机桌面图标乱了,如何解决电脑桌面图标乱跑的问题
  14. 【云原生】Docker高级篇之网络、compose、可视化、监控
  15. 【2022年度总结2023新年Flag】--2022:高考失利,我奋力奔跑的大一上;2023,朝着成为更优秀的自己迈进ing
  16. Java反射之Filed(类中的属性对象)
  17. 今日头条面试题,供大家参考
  18. php-resque消息队列
  19. python大学生社团管理系统
  20. docxtpl 学习笔记

热门文章

  1. 计算机网络与通信思维导图,用思维导图描述5G场景
  2. python合并视频和音频_真没想到,Python 还能实现 5 毛特效
  3. 为此计算机上的所有用户安装此加载项,activex 安装给所有计算机用户
  4. assembly 输出ab中所有数_.NET Core中批量注入Grpc服务
  5. js微信监听返回_微信小程序(2)- 框架结构amp;运行环境
  6. 让读博轻松、愉快的10种方法
  7. 27岁博士毕业,32岁成清华博导!黄高助理教授:DenseNet发明者
  8. ​【文末有福利】股票跨度——真实世界的算法
  9. 郭雷:让反馈控制“对付”智能时代不确定性
  10. 如果唐代诗人有微博,简直就是真实版「梦回大唐」