开发函数计算的正确姿势 —— 安装第三方依赖

前言

首先介绍下在本文出现的几个比较重要的概念:

函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息参考。
Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档参考。
fun install: fun install 是 fun 工具的一个子命令,用于安装 pip 和 apt 依赖,提供了命令行接口和 fun.yml 描述文件两种形式。

备注: 本文介绍的技巧需要 Fun 版本大于等于 2.9.3。

函数计算安装第三方依赖一大痛点,文章 函数计算安装依赖库方法小结 对可能会遇到的问题和解决方法做了细致总结,fun install 是基于之前的经验和成果将最佳实践的方法固化到工具中,方便用户便捷的安装依赖。

初始化

使用 fun install init 在当前目录初始化一个 fun.yml 文件。(这一步不是必须的,如果您打算手写 fun.yml 然后通过 fun install 命令批量执行 task,init 是一个好的开始。)

在函数计算项目根目录执行 fun install init 命令,选择一个 runtime。

$ fun install init
? Select runtime (Use arrow keys)python2.7python3nodejs6nodejs8java8php7.2

然后会在当前目录生成一个 fun.yml 文件,内容如下:

runtime: python2.7
tasks: []

安装 pip 包依赖

下面的命令安装 python 的 tensorflow 包

$ fun install --runtime python2.7 --package-type pip tensorflow
skip pulling image aliyunfc/runtime-python2.7:build-1.2.0...
Task => [UNNAMED]=> PYTHONUSERBASE=/code/.fun/python pip install --user tensorflow

说明

  • --runtime 指定 runtime,如果已经初始化 fun.yml 文件, 由于 fun.yml 里声明了 runtime ,该选项可以省略。
  • --package-type 指定安装依赖的类型,pip 和 apt 是目前的两个可选值。
  • tensorflow 是一个 pip 包名。

命令执行在 fc-docker 提供的 container 中,容器内部执行的命令会逐行打印出来,比如上面命令中内部真实执行了 PYTHONUSERBASE=/code/.fun/python pip install --user tensorflow 命令。

安装完成以后会在生成一个 .fun 目录, 可执行文件会被放置到 .fun/python/bin 目录下,库文件放置到 .fun/python/lib/python2.7/site-packages 下。

.fun
└── python├── bin│   ├── freeze_graph│   ├── markdown_py│   ├── pbr│   ├── saved_model_cli│   ├── tensorboard│   ├── tflite_convert│   ├── toco│   └── toco_from_protos└── lib└── python2.7└── site-packages├── tensorboard├── tensorboard-1.12.2.dist-info├── tensorflow├── tensorflow-1.12.0.dist-info├── termcolor-1.1.0.dist-info...

相比之前的 pip install -t . <package-name> 方式,fun install 安装文件的存放位置更有组织,依赖文件和代码文件分离开了,便于清理、拆分后借助 OSS 或 NAS 初始化依赖文件。但是组织过后也带来一个新问题,需要用户自定义环境变量库文件才能被程序找到。为了方便用户使用提供了一个 fun install env 打印出必要的环境变量。

$ fun install env
LD_LIBRARY_PATH=/code/.fun/root/usr/lib/x86_64-linux-gnu:/code:/code/lib:/usr/local/lib
PATH=/code/.fun/root/usr/local/bin:/code/.fun/root/usr/local/sbin:/code/.fun/root/usr/bin:/code/.fun/root/usr/sbin:/code/.fun/root/sbin:/code/.fun/root/bin:/code/.fun/python/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/sbin:/bin
PYTHONUSERBASE=/code/.fun/python

关于如果设定函数计算的环境变量,请参考 https://help.aliyun.com/document_detail/69777.html 。如果您使用 fun local 和 fun deploy 进行调试和部署,您无需关注环境变量问题,已经帮您设定好了。

使用 --save 持久化

install 命令加上 --save 参数,会将命令持久化成 task 保存到 fun.yml 文件中。

$ fun install --runtime python2.7 --package-type pip --save tensorflow
skip pulling image aliyunfc/runtime-python2.7:build-1.2.0...
Task => [UNNAMED]=> PYTHONUSERBASE=/code/.fun/python pip install --user tensorflow

上面的命令多加了一行 --save 参数,查看 fun.yml 内容:

runtime: python2.7
tasks:- pip: tensorflowlocal: true

之后直接执行 fun install 不带参数,就可以依次执行任务。

$ fun install
skip pulling image aliyunfc/runtime-python2.7:build-1.2.0...
Task => [UNNAMED]=> PYTHONUSERBASE=/code/.fun/python pip install --user tensorflow

使用 -v 显示详细日志

$ fun install -v
skip pulling image aliyunfc/runtime-python3.6:build-1.2.0...
Task => [UNNAMED]=> apt-get update (if need)
Ign http://mirrors.aliyun.com stretch InRelease
Get:1 http://mirrors.aliyun.com stretch-updates InRelease [91.0 kB]
Get:2 http://mirrors.aliyun.com stretch-backports InRelease [91.8 kB]
Get:3 http://mirrors.aliyun.com stretch/updates InRelease [94.3 kB]
Hit http://mirrors.aliyun.com stretch Release.gpg
Hit http://mirrors.aliyun.com stretch Release
Get:4 http://mirrors.aliyun.com stretch-updates/main Sources [3911 B]
....

安装 apt 包依赖

函数计算使用 apt-get 安装依赖是另一类常见的安装问题,使用 fun install 也可以方便的安装。

$ fun install --runtime python3 --package-type apt libzbar0
skip pulling image aliyunfc/runtime-python3.6:build-1.2.0...
Task => [UNNAMED]=> apt-get update (if need)=> apt-get install -y -d -o=dir::cache=/code/.fun/tmp libzbar0=> bash -c 'for f in $(ls /code/.fun/tmp/archives/*.deb); do dpkg -x $f /code/.fun/root; done;'=> bash -c 'rm -rf /code/.fun/tmp/archives'

使用方法及其参数和 pip 包依赖类似,只需要将 --package-type 设定成 apt, 包名使用日常 apt-get 可以安装的 deb 包名即可。

使用 fun.yml

fun.yml 由一组 task 组成,执行 fun install 命令时会依次执行 task ,达到批量安装的效果。

fun.yml 的文件格式如下

runtime: python3
tasks:- name: install libzbar0apt: libzbar0local: true- name install Pillow by pippip: Pillowlocal: true- name: just test shell taskshell: echo '111' > 1.txt

runtime 是必填的字段。目前 task 有三种类型:apt, pip 和 shell。fun.yml 文件放置在 template.yml 文件中函数 codeUri 指向的目录,如果 template.yml 里声明了多个函数,并且放置在不同的 codeUri 目录,需要创建多个 fun.yml 文件。

所有 task 的 name 字段是可选的,没有 name 字段的时候执行的时候会输出为

Task => [UNNAMED]

apt/pip task

apt 和 pip 类型的 task 都是 install task 的子类型,描述格式类似

name: install libzbar0
apt: libzbar0
local: true

上面的 task 描述与下面的命令是等价的

fun install --package-type apt libzbar0

在使用 fun install 安装的过程中,使用 --save 参数可以在当前目录的 fun.yml 文件中生成上面 task 的描述结构。

local 字段默认为 true,表示依赖会被装在当前目录的 .fun 子目录下,打包 zip 的时候回一并打包进去。设定为 false,依赖安装到系统目录,这种情况一般用于编译依赖,比如某个执行文件或者库是编译或者构建期需要的,运行期不要,那可以设定 local: false,打包的时候会被忽略,不影响最终 zip 包的文件尺寸。

shell task

shell 类型的 task 是为基于源码编码的安装场景设计的。

name: install from source
shell: ./autogen.sh --disable-report-builder --disable-lpsolve --disable-coinmp

示例

下面是一个 python3 实现简单二维码识别程序部署到函数计算的例子。源码位于 https://github.com/aliyun/fun/tree/master/examples/install/pyzbar_example

本例子使用 pip 的 pyzbar 库进行二维码识别,pyzbar 依赖 apt-get 安装的 libzbar0 库。装载图片需要 pip 的 Pillow 库。所以 fun.yml 的文件描述如下

runtime: python3
tasks:- apt: libzbar0local: true- pip: Pillowlocal: true- pip: pyzbarlocal: true

使用 fun install 安装依赖

$ fun install
skip pulling image aliyunfc/runtime-python3.6:build-1.2.0...
Task => [UNNAMED]=> apt-get update (if need)=> apt-get install -y -d -o=dir::cache=/code/.fun/tmp libzbar0=> bash -c 'for f in $(ls /code/.fun/tmp/archives/*.deb); do dpkg -x $f /code/.fun/root; done;'=> bash -c 'rm -rf /code/.fun/tmp/archives'
Task => [UNNAMED]=> PYTHONUSERBASE=/code/.fun/python pip install --user Pillow
Task => [UNNAMED]=> PYTHONUSERBASE=/code/.fun/python pip install --user pyzbar

template.yml 文件内容如下

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:pyzbar-srv:Type: 'Aliyun::Serverless::Service'pyzbar-fun:Type: 'Aliyun::Serverless::Function'Properties:Handler: index.handlerRuntime: python3Timeout: 60MemorySize: 128CodeUri: .

index.py 文件内容如下:

from pyzbar.pyzbar import decode
from pyzbar.pyzbar import ZBarSymbol
from PIL import Imagedef handler(event, context):img = Image.open('./qrcode.png')return decode(img, symbols=[ZBarSymbol.QRCODE])[0].data

使用 fun local 在本地执行

fun local invoke pyzbar-fun
skip pulling image aliyunfc/runtime-python3.6:1.2.0...
ThalassiodraconRequestId: 964980d1-1f1b-4f91-bfd8-eadd26a307b3          Billed Duration: 630 ms         Memory Size: 1998 MB    Max Memory Used: 32 MB

Thalassiodracon 即为识别后的输出结果。

小结

本文介绍了 fun 工具的一个新特性 fun install ,使用 fun install 可以方便的安装 apt 和 pip 软件包,对于多次安装的工程化需求可以考虑将安装步骤持久化为 fun.yml 文件. fun.yml 文件提供了比命令行更多的功能,可以编写 shell 类型的 task,以支持源码安装的场景。可以通过设定 local: false将依赖安装的系统目录,以解决编译依赖而非运行依赖的情况。

 

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

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

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

相关文章

终于等到你!阿里正式向 Apache Flink 贡献 Blink 源码

阿里妹导读&#xff1a;如同我们去年12月在 Flink Forward China 峰会所约&#xff0c;阿里巴巴内部 Flink 版本 Blink 将于 2019 年 1 月底正式开源。今天&#xff0c;我们终于等到了这一刻。 阿里资深技术专家大沙&#xff0c;将为大家详细介绍本次开源的Blink主要功能和优化…

Oracle 表空间常用sql

--查询表空间使用情况 select a.tablespace_name,a.bytes / 1024 / 1024 "sum MB",(a.bytes - b.bytes) / 1024 / 1024 "used MB",b.bytes / 1024 / 1024 "free MB",round(((a.bytes - b.bytes) / a.bytes) * 100, 2) "used%"from (se…

五省竞赛计算机作品,关于征集2017年华北五省(市、自治区)及港澳台大学生计算机应用大赛河北赛区竞赛作品的通知...

原标题&#xff1a;关于征集2017年华北五省(市、自治区)及港澳台大学生计算机应用大赛河北赛区竞赛作品的通知学校各单位、各位老师们&#xff1a;为深入贯彻落实《国家中长期教育改革和发展规划纲要》(2010-2020年)和教育部《关于全面提高高等教育质量的若干意见》(教高[2012]…

Auto-Keras与AutoML:入门指南

在本教程中&#xff0c;你将学习如何使用Auto-Keras&#xff08;Google的AutoML的开源替代品&#xff09;来实现自动化机器学习和深度学习。 目前来说&#xff0c;深度学习从业者在数据集上训练神经网络时&#xff0c;主要正在尝试优化和平衡两个目标&#xff1a; 1.定义适合…

java实现遍历文件夹下的文件及文件夹

package com.gblfy.test;import java.io.File; import java.util.ArrayList; import java.util.LinkedList; import java.util.List;/*** 文件常用工具类** author gblfy* description FileUtil* date 2020/07/03 17:05*/ public class FileUtil {/*** 遍历目录下面的文件夹和文…

TensorFlow 2.0深度强化学习指南

在本教程中&#xff0c;我将通过实施Advantage Actor-Critic(演员-评论家&#xff0c;A2C)代理来解决经典的CartPole-v0环境&#xff0c;通过深度强化学习&#xff08;DRL&#xff09;展示即将推出的TensorFlow2.0特性。虽然我们的目标是展示TensorFlow2.0&#xff0c;但我将尽…

互联网诞生记: 浪成于微澜之间

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 老姜出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;“我早就预言了互联网。1975年&#xff0c;所有的技术都已经准备好了&#xff1b;1985年&#xff0c;所有的技术都应该很平常了&#xff1b;而直到199…

20丨8年哈工程计算机专业录取分数线多少,双一流211大学 哈尔滨工程大学2020年各省各专业录取分数线...

哈尔滨工程大学是国家重点大学&#xff0c;也是国家211、双一流大学&#xff0c;其最早前身是中国人民解放军军事工程学院(哈军工)&#xff0c;后面的陆续建设也是保留并深入发展了军工相关专业&#xff0c;目前以该类专业为优势和特色。2020年高考哈尔滨工程大学面向全国各省市…

java 批量为图片添加图标水印和文字水印

需求&#xff0c;给指定目录下面以.jpg结尾的文件&#xff0c;添加图标水印和文字水印 文章目录一、基础版本二、升级版本三、依赖一、基础版本 package com.gblfy.util;import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder;import…

“有趣”的投影:当PCA失效时怎么办?

目前&#xff0c;大多数的数据科学家都比较熟悉主成分分析 (Principal Components Analysis&#xff0c;PCA)&#xff0c;它是一个探索性的数据分析工具。可以这样简要的描述&#xff1a;研究人员经常使用PCA来降低维度&#xff0c;希望在他们的数据中找出有用的信息&#xff0…

线程最最基础的知识

戳蓝字“CSDN云计算”关注我们哦&#xff01;什么是线程试想一下没有线程的程序是怎么样的&#xff1f;百度网盘在上传文件时就无法下载文件了&#xff0c;得等文件上传完成后才能下载文件。这个我们现在看起来很反人性&#xff0c;因为我们习惯了一个程序同时可以进行运行多个…

特征工程自动化如何为机器学习带来重大变化

随着技术的快速发展&#xff0c;在数据科学领域中&#xff0c;包括库、工具和算法等总会不断地变化的。然而&#xff0c;一直都有这么一个趋势&#xff0c;那就是自动化水平不断地提高。 近些年来&#xff0c;在模型的自动化选择和超参数调整方面取得了一些进展&#xff0c;但…

工作组访问不到别人的计算机,众果搜的博客

常见问题&#xff1a;A 在网上邻居列表中找不到目标计算机。B 在网上邻居列表能找到&#xff0c;但却访问不了。C 以UNC路径能访问&#xff0c;但在网上邻居列表中却找不到。1、网上邻居列表的维护依赖于浏览服务(Computer Browers)&#xff0c;计算机通过广播方式登记到浏览器…

java 实现压缩zip的几种方案

需求&#xff0c;将指定目录下的文件及文件夹压缩成一个指定赔案号为名称&#xff0c;以".zip"结尾的压缩包提供客户下载。 package com.gblfy.util;import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.Fil…

序列模型简介——RNN, Bidirectional RNN, LSTM, GRU

既然我们已经有了前馈网络和CNN&#xff0c;为什么我们还需要序列模型呢&#xff1f;这些模型的问题在于&#xff0c;当给定一系列的数据时&#xff0c;它们表现的性能很差。序列数据的一个例子是音频的剪辑&#xff0c;其中包含一系列的人说过的话。另一个例子是英文句子&…

行!人工智能玩大了!程序员:太牛!你怎么看?

人工智能真的玩大了吗&#xff1f;人工智能行业的人才真的“爆发了&#xff1f;”AI程序员究竟怎么样&#xff1f;中国AI前景分析 程序员与远方最新参考&#xff0c;是12月2日出炉的《人工智能技术专利深度分析报告》。中国AI专利&#xff0c;已经位于世界前列&#xff0c;且正…

可应用于实际的14个NLP突破性研究成果(一)

语言理解对计算机来说是一个巨大的挑战。幼儿可以理解的微妙的细微差别仍然会使最强大的机器混淆。尽管深度学习等技术可以检测和复制复杂的语言模式&#xff0c;但机器学习模型仍然缺乏对我们的语言真正含义的基本概念性理解。 但在2018年确实产生了许多具有里程碑意义的研究…

String 常用API

public static void main(String[] args) {/*** String 常用API* 字符串* 1>截取* 2>替换**/String fileSuffix ".jpg";int i fileSuffix.indexOf(".");//截取.之后的内容&#xff0c;包含. indexs0String newStr fileSuffix.substring(i 0);…

小学五年级年级计算机教学计划,小学五年级信息技术教学计划范文

人类社会已进入信息时代,日新月异的信息技术在不断地改变着周围的世界。为了推广计算机信息技术,提高全民族的科学文化素质,发展小学信息技术教育。下面是学习啦小编整理的小学五年级信息技术教学计划范文&#xff0c;希望对大家有所帮助!小学五年级信息技术教学计划范文(一)一…

阿里资深技术专家:优秀的数据库存储引擎应具备哪些能力?

导读 本文作者是阿里巴巴OLTP数据库团队资深技术专家——曲山。作为自研高性能、低成本存储引擎X-Engine的负责人&#xff0c;曲山眼中的优秀关系型数据库存储引擎应该具备哪些能力呢&#xff1f; 正文 数据库内核按层次来分&#xff0c;就是两层&#xff1a;SQL & Stor…