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

背景

最近在处理线上工单的时候,遇到一个用户使用 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 都能够自动帮你设置第三方库的依赖引用路径,让您无需关心环境变量问题。

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蚂蚁金服核心技术:百亿特征实时推荐算法揭秘

文章提出一整套创新算法与架构,通过对TensorFlow底层的弹性改造,解决了在线学习的弹性特征伸缩和稳定性问题,并以GroupLasso和特征在线频次过滤等自研算法优化了模型稀疏性。在支付宝核心推荐业务获得了uvctr的显著提升,并较大地提…

老码农肺腑直言:为什么我不建议你学Python?

关于Python,我们听到最多的一句话就是:代码简洁。目前来看,代码量上C:Java:Python100:10:1。Python简洁度完胜,但这却也是他的“死亡缺点”!今天想跟大家分享,学Python的一系列惊天大坑……Python钱多“话少…

如何评估深度学习模型效果?阿里工程师这么做

复杂的深度模型中,如果效果不好,是因为网络设计的欠缺?还是数据天然缺陷?是训练代码的bug?还是Tensorflow自身的问题?基于此,阿里工程师推出了DeepInsight深度学习质量平台,致力于解…

开发者如何赶上 5G 风口?

戳蓝字“CSDN云计算”关注我们哦!随着5G正式步入商用,5G 技术引发广泛关注。据信息通信研究院《5G经济社会影响白皮书》预测,2030年,5G将直接带动的总产出、经济增加值、就业机会分别为6.3万亿元、2.9万亿元和800万个。据BOSS直聘…

罗辑思维在全链路压测方面的实践和工作笔记

业务的知名度越高,其背后技术团队承受的压力就越大。一旦出现技术问题,就有可能被放大,尤其是当服务的是对知识获取体验要求颇高的用户群体。 提供知识服务的罗辑思维主张“省时间的获取知识”,那么其技术团队在技术实践方面是如…

能用机器完成的,千万别堆工作量|持续集成中的性能自动化测试

1.背景 当前闲鱼在精益开发模式下,整个技术团队面临了诸多的能力落地和挑战,尤其是效能方面的2-1-1的目标(2周需求交付周期,1周需求开发周期,1小时达到发布标准),具体可见 闲鱼工程师是如何构建持续集成流水线&#x…

详解GPU技术关键参数和应用场景

戳蓝字“CSDN云计算”关注我们哦!作者 | Hardy责编 | 阿秃随着云计算,大数据和人工智能技术发展,边缘计算发挥着越来越重要的作用,补充数据中心算力需求。计算架构要求多样化,需要不同的CPU架构来满足不断增长的算力需…

5款神器级别Github 的Chrome插件

文章目录1. Chrome插件一:octotree2. Chrome插件二:sourcegraph3. Chrome插件三:Enhanced GitHub4. Chrome插件四:octolinker5. Chrome插件五:gitzip for github1. Chrome插件一:octotree Octotree是一个 …

用AI说再见!“辣眼睛”的买家秀

阿里妹导读:提起买家秀和卖家秀,相信大家脑中会立刻浮现出诸多画面。同一件衣服在不同人、光线、角度下,会呈现完全不同的状态。运营小二需从大量的买家秀中挑选出高质量的图片。如果单纯靠人工来完成,工作量过于巨大。下面&#…

云+X案例展 | 电商零售类:WakeData助力叁拾加数字化变革

本案例由WakeData投递并参与评选,CSDN云计算独家全网首发;更多关于【云X 案例征集】的相关信息,点击了解详情丨挖掘展现更多优秀案例,为不同行业领域带来启迪,进而推动整个“云行业”的健康发展。在新零售时代下&#…

linux环境安装Kafka最新版本 jdk1.8

文章目录一、环境分布二、实战1. kafka下载2. 解压3. 配置4. 编写启动脚本5. 编写关闭脚本6. 赋予脚本可执行权限7. 脚本使用案例一、环境分布 软件版本jdk1.8kafkakafka_2.13-2.5.0 二、实战 kafka官网地址: http://kafka.apache.org/downloads 1. kafka下载 …

基于泛型编程的序列化实现方法

写在前面 序列化是一个转储-恢复的操作过程,即支持将一个对象转储到临时缓冲或者永久文件中和恢复临时缓冲或者永久文件中的内容到一个对象中等操作,其目的是可以在不同的应用程序之间共享和传输数据,以达到跨应用程序、跨语言和跨平台的解耦…

微服务架构下,解决数据一致性问题的实践

随着业务的快速发展,应用单体架构暴露出代码可维护性差、容错率低、测试难度大和敏捷交付能力差等诸多问题,微服务应运而生。微服务的诞生一方面解决了上述问题,但是另一方面却引入新的问题,其中主要问题之一就是:如何…

2019阿里云开年Hi购季满返活动火热报名中!

2019阿里云云上采购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段、3月04日-3月16日的新购满返5折抢购阶段、3月16日-3月31日的续费抽豪礼5折抢购阶段。 整个大促活动包含1个主会场…

2019云计算高光时刻:乱云飞渡 传统IT大溃败

前言:2019年,物理机最后一张王牌也败给了云计算,无论从成本还是性能的角度,都没有不选云计算的理由,这是一个时代的终结。 2019的云计算市场格局,依旧是马太效应凸显、大者恒大的趋势继续,但在…

java 集成 kafka 0.8.2.1 适配jdk1.6

文章目录一、版本说明二、实战2.1. 依赖2.2. 生产者代码2.3. 消费端代码2.4. 测试三、小伙伴疑难解答3.1. 首先新建一个maven项目3.2. 把我的依赖和代码复制过去3.3. 把我写的case调试通3.4. 找到左边External Libraries3.5. jar处理3.6. 打开非maven项目,添加jar3.…

阿里云MWC 2019发布7款重磅产品,助力全球企业迈向智能化

当地时间2月25日,在巴塞罗那举行的MWC 2019上,阿里云面向全球发布了7款重磅产品,涵盖无服务器计算、高性能存储、全球网络、企业级数据库、大数据计算等主要云产品,可满足电子商务、物流、金融科技以及制造等各行业企业的数字化转…

linux环境安装 kafka 0.8.2.1 jdk1.6

文章目录一、环境分布二、实战1. kafka下载2. 解压3. 配置4. 编写启动脚本5. 编写关闭脚本6. 赋予脚本可执行权限7. 脚本使用案例三、Config配置四、Consumer配置五、Producer配置很多小伙伴问我,为什么不用最新版本的kafka呢?关于这个问题,都…

元旦限时特惠,耳机、书籍等大降价

戳蓝字“CSDN云计算”关注我们哦!今天是12月31日离2020年仅有不到一天的时间你们的2019年目标都实现了吗?在这一年你写了多少行代码改了多少个bug呢?2020年的愿望是否也是希望自己写的代码bug能少一些?小编的2020年希望能买到更多…

ant编译web项目

文章目录1.下载ant2. 解压ant3. 配置an环境变量4. 验证二、编译项目2.1. 新建一个build.xml2.2. 编译项目测试1.下载ant 官网链接: https://ant.apache.org/srcdownload.cgi 2. 解压ant 3. 配置an环境变量 4. 验证 ant -v二、编译项目 2.1. 新建一个build.xml…