- 浏览: 110828 次
- 性别:
- 来自: 北京
最新评论
开发函数计算的正确姿势——使用交互模式安装依赖
前言
--
首先介绍下在本文出现的几个比较重要的概念:
> **函数计算(Function Compute)**: [函数计算](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fstatistics.functioncompute.com%2F%3Ftitle%3D%25E5%25BC%2580%25E5%258F%2591%25E5%2587%25BD%25E6%2595%25B0%25E8%25AE%25A1%25E7%25AE%2597%25E7%259A%2584%25E6%25AD%25A3%25E7%25A1%25AE%25E5%25A7%25BF%25E5%258A%25BF%25E2%2580%2594%25E2%2580%2594%25E4%25BD%25BF%25E7%2594%25A8%25E4%25BA%25A4%25E4%25BA%2592%25E6%25A8%25A1%25E5%25BC%258F%25E5%25AE%2589%25E8%25A3%2585%25E4%25BE%259D%25E8%25B5%2596%26amp%3Bauthor%3D%25E5%2580%259A%25E8%25B4%25A4%26amp%3Bsrc%3Darticle%26amp%3Burl%3Dhttp%253A%252F%252Ffc.console.aliyun.com%252F%253Ffctraceid%253DYXV0aG9yJTNEJUU1JTgwJTlBJUU4JUI0JUE0JTI2dGl0bGUlM0QlRTUlQkMlODAlRTUlOEYlOTElRTUlODclQkQlRTYlOTUlQjAlRTglQUUlQTElRTclQUUlOTclRTclOUElODQlRTYlQUQlQTMlRTclQTElQUUlRTUlQTclQkYlRTUlOEElQkYlRTIlODAlOTQlRTIlODAlOTQlRTQlQkQlQkYlRTclOTQlQTglRTQlQkElQTQlRTQlQkElOTIlRTYlQTglQTElRTUlQkMlOEYlRTUlQUUlODklRTglQTMlODUlRTQlQkUlOUQlRTglQjUlOTY%253D)是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息[参考](https://help.aliyun.com/product/50980.html)。
> **Fun**: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档[参考](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fgithub.com%2Faliyun%2Ffun)。
**备注: 本文介绍的技巧需要 Fun 版本大于等于 3.0.0-beta.1 。**
依赖工具
----
本项目是在 MacOS 下开发的,涉及到的工具是平台无关的,对于 Linux 和 Windows 桌面系统应该也同样适用。在开始本例之前请确保如下工具已经正确的安装,更新到最新版本,并进行正确的配置。
* [Docker](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fwww.docker.com%2F)
* [Fun](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fgithub.com%2Faliyun%2Ffun)
Fun 和 Fcli 工具依赖于 docker 来模拟本地环境。
对于 MacOS 用户可以使用 [homebrew](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fbrew.sh%2F) 进行安装:
```
brew cask install docker
brew tap vangie/formula
brew install fun
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
Windows 和 Linux 用户安装请参考:[https://github.com/aliyun/fun/blob/master/docs/usage/installation.md](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fgithub.com%2Faliyun%2Ffun%2Fblob%2Fmaster%2Fdocs%2Fusage%2Finstallation.md)
安装好后,记得先执行 `fun config` 初始化一下配置。
**注意**, 如果你已经安装过了 fun,确保 fun 的版本在 3.0.0-beta.1 以上。
```
$ fun --version
3.0.0-beta.1
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
背景
--
函数计算以 Zip 压缩文件格式作为约定的交付物,交付物通常包含代码和依赖库文件。这些依赖库文件通常分为系统依赖(使用 apt-get 包管理安装的库)和语言运行时依赖(使用语言相关的包管理器如 npm、pip 安装的库)。
### 系统依赖通常不可移植
通常情况下系统依赖和环境相关,比如我们希望在函数里调用 brotli 命令解压文件,如果我们在开发机 mac 上,使用 `brew install brotli` 安装了 brotil 命令,然后打包发布到函数计算平台是无法运行的。有时候即使开发机是 linux 也不一定可以。这是因为通过系统提供的包管理工具安装的可执行程序和动态链接库与系统的类型和版本强相关。不同系统上安装的这些程序和文件不具备可移植性。
### 语言依赖也存在不可移植的情况
通常情况下语言依赖是平台无关的,比如说使用 `npm install jszip` 安装一个 nodejs 依赖,该依赖可以运行在不同的操作系统和不同的 nodejs 版本下。语言平台上的依赖通常是可移植的,单也有例外的情况。如: `npm install node-pty` 就是一个存在原生绑定(native binding)的例子。node-pty 模块安装过程中,依赖一些 c/c++ 代码,这些代码会在安装的过程中进行编译,我们知道 c/c++ 代码虽然也具备平台移植性,但是其编译产物是不可移植的。
### DSL 脚本的不足
Fun 2.0 版本支持依赖安装 DSL 文件 fun.yml,fun.yml 为依赖安装提供了批量模式。日常开发提供了一种命令模式,如:`fun install --package-type pip tensorflow`。在 Fun 3.0 中我们提供了一种全新的 DSL 文件 Funfile。Funfile 可以理解为 Dockerfile 的语法子集,让熟悉 docker 的开发者可以快速上手。
但是无论是 fun.yml 或 Funfile,以及命令模式,对于开发者都有一个痛点。那就是不知道环境里当前的状态:
1. 已经安装的软件有哪些
2. 某个目录下有些什么文件
3. 文件的内容以及属性是什么
开发者需要可以交互的沙箱环境。该功能在 Fun 2.0 中没有,用户常常使用 `fcli sbox` 命令作为替代,或者直接使用 [fc-docker](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fgithub.com%2Faliyun%2Ffc-docker) 项目提供的镜像启动一个 container。`docker run --rm -it -v $(pwd):/code aliyunfc/runtime-python2.7:build bash` 但是这些复杂的命令和参数需要用户具备足够的 docker 背景知识以及对函数计算工作原理的了解。
为了更好的解决上述问题,提升用户的开发体验,我们在 Fun 3.0 中提供了 `fun install sbox` 子命令。
![fun_install_sbox](https://yqfile.alicdn.com/11addcabc7e04dd8766eba9fd2d254d681c0273e.gif)
![](https://data-analysis.cn-shanghai.log.aliyuncs.com/logstores/article-logs/track_ua.gif?APIVersion=0.6.0&title=%E5%BC%80%E5%8F%91%E5%87%BD%E6%95%B0%E8%AE%A1%E7%AE%97%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%A7%BF%E5%8A%BF%E2%80%94%E2%80%94%E4%BD%BF%E7%94%A8%E4%BA%A4%E4%BA%92%E6%A8%A1%E5%BC%8F%E5%AE%89%E8%A3%85%E4%BE%9D%E8%B5%96&author=%E5%80%9A%E8%B4%A4&src=article)
命令行参数
-----
```
$ fun install sbox --help
Usage: fun install sbox [-f|--function <[service/]function>] [-r|--runtime <runtime>] [-i|--interactive] [-e|--env key=val ...] [-e|--cmd <cmd>]
Start a local sandbox for installation dependencies or configuration
Options:
-f, --function <[service/]function> Specify which function to execute installation task.
-r, --runtime <runtime> function runtime, avaliable choice is: nodejs6, nodejs8, nodejs10, python2.7, python3, java8, php7.2, custom
-i, --interactive run as interactive mode. Keep STDIN open and allocate a pseudo-TTY when in a interactive shell. (default: false)
-e, --env <env> environment variable, ex. -e PATH=/code/bin (default: [])
-c, --cmd <cmd> command with arguments to execute inside the installation sandbox.
-h, --help output usage information
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
快速开始
----
下面以项目 [pyzbar\_example](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fgithub.com%2Falibaba%2Ffuncraft%2Ftree%2Fmaster%2Fexamples%2Finstall%2Fpyzbar_example) 为例, pyzbar\_example 项目包含如下文件
```
$ tree .
.
├── fun.yml
├── index.py
├── qrcode.png
└── template.yml
0 directories, 4 files
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
其中 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.handler
Runtime: python3
Timeout: 60
MemorySize: 128
CodeUri: .
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
### 启动交互模式 sbox
```
$ fun install sbox -f pyzbar-fun -i
using template: template.yml
root@fc-python3:/code# ls
fun.yml index.py qrcode.png template.yml
root@fc-python3:/code# exit
exit
$
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
在 template.yml 所在的项目目录执行 fun install sbox,其中参数
* \-f/--function 参数指定启动 sbox 的函数,本例中函数所设定的 runtime 为 python3,所以 python3 环境的沙箱环境会被启动起来,函数 pyzbar-fun 所对应的 CodeUri 目录会被挂载到沙箱环境内部的 /code 目录,上面例子中在沙箱环境内 ls 命令返回的文件列表证实了这一点。
* \-i/--interactive 参数表示启动交互模式,对应非交互模式的用途可以看后面的示例。
如果 template.yml 文件并不存在,或者 template.yml 配置文件内的函数尚未配置可以 使用 --runtime 参数启动交互模式,此时当前目录会被挂载到沙箱环境的 /code 目录。
```
$ fun install sbox -r nodejs10 -i
root@fc-nodejs10:/code# ls
fun.yml index.py qrcode.png template.yml
root@fc-nodejs10:/code# exit
exit
$
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
上面的方法适用于临时启动一个 sbox 做些动手实验的场景。
#### 使用 fun-install 安装 apt 和 pip 依赖
```
$ fun install sbox -f pyzbar-fun -i
using template: template.yml
root@fc-python3:/code# fun-install apt-get install libblas3
Task => [UNNAMED]
=> apt-get update (if need)
=> apt-get install -y -d -o=dir::cache=/code/.fun/tmp libblas3
=> bash -c
for f in $(ls /code/.fun/tmp/archives/*.deb); do
dpkg -x $f /code/.fun/root;
mkdir -p /code/.fun/tmp/deb-control/${f%.*};
dpkg -e $f /code/.fun/tmp/deb-control/${f%.*};
if [ -f "/code/.fun/tmp/deb-control/${f%.*}/postinst" ]; then
FUN_INSTALL_LOCAL=true /code/.fun/tmp/deb-control/${f%.*}/postinst configure;
fi;
done;
=> bash -c 'rm -rf /code/.fun/tmp/archives'
root@fc-python3:/code# fun-install --help
Usage: fun local [options] [command]
build function codes or install related depedencies for Function Compute
Options:
-h, --help output usage information
Commands:
apt-get install apt depencies
pip install pip depencies
build build function codes for Function Compute
help [cmd] display help for [cmd]
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
### 非交互模式下使用 sbox
使用如下一行命令打印出 pyzbar-fun 函数的 sbox 内预装的 deb 包。
```
$ fun install sbox -f pyzbar-fun -c 'dpkg -l'
using template: template.yml
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==================================-================================-============-===============================================================================
ii acl 2.2.52-2 amd64 Access control list utilities
ii adduser 3.113+nmu3 all add and remove users and groups
ii apt 1.0.9.8.4 amd64 commandline package manager
ii apt-utils 1.0.9.8.5 amd64 package management related utility programs
ii autoconf 2.69-8 all automatic configure script builder
ii automake 1:1.14.1-4+deb8u1 all Tool for generating GNU Standards-compliant Makefiles
...(此处省略了许多行)
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
也可以通过管道将外部命令的内容传递到内部
```
$ echo hello | fun install sbox -r nodejs10 -i -c 'cat -'
hello
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
注意这里 `-i` 参数不能省略,该参数表示接受标准输入。
小结
--
`fun install sbox` 是 `fcli sbox` 的替代工具,除了支持交互模式,沿用了指定 runtime 启动 sbox,也实现了 fun 风格的指定函数启动 sbox,更加便利。同时也支持内联命令和管道等非交互模式的用法,为编写脚本提供了更好的支持。
[原文链接](https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/739645%3Futm_content%3Dg_1000094672)
本文为阿里云内容,未经允许不得转载。
--
首先介绍下在本文出现的几个比较重要的概念:
> **函数计算(Function Compute)**: [函数计算](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fstatistics.functioncompute.com%2F%3Ftitle%3D%25E5%25BC%2580%25E5%258F%2591%25E5%2587%25BD%25E6%2595%25B0%25E8%25AE%25A1%25E7%25AE%2597%25E7%259A%2584%25E6%25AD%25A3%25E7%25A1%25AE%25E5%25A7%25BF%25E5%258A%25BF%25E2%2580%2594%25E2%2580%2594%25E4%25BD%25BF%25E7%2594%25A8%25E4%25BA%25A4%25E4%25BA%2592%25E6%25A8%25A1%25E5%25BC%258F%25E5%25AE%2589%25E8%25A3%2585%25E4%25BE%259D%25E8%25B5%2596%26amp%3Bauthor%3D%25E5%2580%259A%25E8%25B4%25A4%26amp%3Bsrc%3Darticle%26amp%3Burl%3Dhttp%253A%252F%252Ffc.console.aliyun.com%252F%253Ffctraceid%253DYXV0aG9yJTNEJUU1JTgwJTlBJUU4JUI0JUE0JTI2dGl0bGUlM0QlRTUlQkMlODAlRTUlOEYlOTElRTUlODclQkQlRTYlOTUlQjAlRTglQUUlQTElRTclQUUlOTclRTclOUElODQlRTYlQUQlQTMlRTclQTElQUUlRTUlQTclQkYlRTUlOEElQkYlRTIlODAlOTQlRTIlODAlOTQlRTQlQkQlQkYlRTclOTQlQTglRTQlQkElQTQlRTQlQkElOTIlRTYlQTglQTElRTUlQkMlOEYlRTUlQUUlODklRTglQTMlODUlRTQlQkUlOUQlRTglQjUlOTY%253D)是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息[参考](https://help.aliyun.com/product/50980.html)。
> **Fun**: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档[参考](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fgithub.com%2Faliyun%2Ffun)。
**备注: 本文介绍的技巧需要 Fun 版本大于等于 3.0.0-beta.1 。**
依赖工具
----
本项目是在 MacOS 下开发的,涉及到的工具是平台无关的,对于 Linux 和 Windows 桌面系统应该也同样适用。在开始本例之前请确保如下工具已经正确的安装,更新到最新版本,并进行正确的配置。
* [Docker](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fwww.docker.com%2F)
* [Fun](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fgithub.com%2Faliyun%2Ffun)
Fun 和 Fcli 工具依赖于 docker 来模拟本地环境。
对于 MacOS 用户可以使用 [homebrew](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fbrew.sh%2F) 进行安装:
```
brew cask install docker
brew tap vangie/formula
brew install fun
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
Windows 和 Linux 用户安装请参考:[https://github.com/aliyun/fun/blob/master/docs/usage/installation.md](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fgithub.com%2Faliyun%2Ffun%2Fblob%2Fmaster%2Fdocs%2Fusage%2Finstallation.md)
安装好后,记得先执行 `fun config` 初始化一下配置。
**注意**, 如果你已经安装过了 fun,确保 fun 的版本在 3.0.0-beta.1 以上。
```
$ fun --version
3.0.0-beta.1
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
背景
--
函数计算以 Zip 压缩文件格式作为约定的交付物,交付物通常包含代码和依赖库文件。这些依赖库文件通常分为系统依赖(使用 apt-get 包管理安装的库)和语言运行时依赖(使用语言相关的包管理器如 npm、pip 安装的库)。
### 系统依赖通常不可移植
通常情况下系统依赖和环境相关,比如我们希望在函数里调用 brotli 命令解压文件,如果我们在开发机 mac 上,使用 `brew install brotli` 安装了 brotil 命令,然后打包发布到函数计算平台是无法运行的。有时候即使开发机是 linux 也不一定可以。这是因为通过系统提供的包管理工具安装的可执行程序和动态链接库与系统的类型和版本强相关。不同系统上安装的这些程序和文件不具备可移植性。
### 语言依赖也存在不可移植的情况
通常情况下语言依赖是平台无关的,比如说使用 `npm install jszip` 安装一个 nodejs 依赖,该依赖可以运行在不同的操作系统和不同的 nodejs 版本下。语言平台上的依赖通常是可移植的,单也有例外的情况。如: `npm install node-pty` 就是一个存在原生绑定(native binding)的例子。node-pty 模块安装过程中,依赖一些 c/c++ 代码,这些代码会在安装的过程中进行编译,我们知道 c/c++ 代码虽然也具备平台移植性,但是其编译产物是不可移植的。
### DSL 脚本的不足
Fun 2.0 版本支持依赖安装 DSL 文件 fun.yml,fun.yml 为依赖安装提供了批量模式。日常开发提供了一种命令模式,如:`fun install --package-type pip tensorflow`。在 Fun 3.0 中我们提供了一种全新的 DSL 文件 Funfile。Funfile 可以理解为 Dockerfile 的语法子集,让熟悉 docker 的开发者可以快速上手。
但是无论是 fun.yml 或 Funfile,以及命令模式,对于开发者都有一个痛点。那就是不知道环境里当前的状态:
1. 已经安装的软件有哪些
2. 某个目录下有些什么文件
3. 文件的内容以及属性是什么
开发者需要可以交互的沙箱环境。该功能在 Fun 2.0 中没有,用户常常使用 `fcli sbox` 命令作为替代,或者直接使用 [fc-docker](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fgithub.com%2Faliyun%2Ffc-docker) 项目提供的镜像启动一个 container。`docker run --rm -it -v $(pwd):/code aliyunfc/runtime-python2.7:build bash` 但是这些复杂的命令和参数需要用户具备足够的 docker 背景知识以及对函数计算工作原理的了解。
为了更好的解决上述问题,提升用户的开发体验,我们在 Fun 3.0 中提供了 `fun install sbox` 子命令。
![fun_install_sbox](https://yqfile.alicdn.com/11addcabc7e04dd8766eba9fd2d254d681c0273e.gif)
![](https://data-analysis.cn-shanghai.log.aliyuncs.com/logstores/article-logs/track_ua.gif?APIVersion=0.6.0&title=%E5%BC%80%E5%8F%91%E5%87%BD%E6%95%B0%E8%AE%A1%E7%AE%97%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%A7%BF%E5%8A%BF%E2%80%94%E2%80%94%E4%BD%BF%E7%94%A8%E4%BA%A4%E4%BA%92%E6%A8%A1%E5%BC%8F%E5%AE%89%E8%A3%85%E4%BE%9D%E8%B5%96&author=%E5%80%9A%E8%B4%A4&src=article)
命令行参数
-----
```
$ fun install sbox --help
Usage: fun install sbox [-f|--function <[service/]function>] [-r|--runtime <runtime>] [-i|--interactive] [-e|--env key=val ...] [-e|--cmd <cmd>]
Start a local sandbox for installation dependencies or configuration
Options:
-f, --function <[service/]function> Specify which function to execute installation task.
-r, --runtime <runtime> function runtime, avaliable choice is: nodejs6, nodejs8, nodejs10, python2.7, python3, java8, php7.2, custom
-i, --interactive run as interactive mode. Keep STDIN open and allocate a pseudo-TTY when in a interactive shell. (default: false)
-e, --env <env> environment variable, ex. -e PATH=/code/bin (default: [])
-c, --cmd <cmd> command with arguments to execute inside the installation sandbox.
-h, --help output usage information
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
快速开始
----
下面以项目 [pyzbar\_example](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fgithub.com%2Falibaba%2Ffuncraft%2Ftree%2Fmaster%2Fexamples%2Finstall%2Fpyzbar_example) 为例, pyzbar\_example 项目包含如下文件
```
$ tree .
.
├── fun.yml
├── index.py
├── qrcode.png
└── template.yml
0 directories, 4 files
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
其中 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.handler
Runtime: python3
Timeout: 60
MemorySize: 128
CodeUri: .
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
### 启动交互模式 sbox
```
$ fun install sbox -f pyzbar-fun -i
using template: template.yml
root@fc-python3:/code# ls
fun.yml index.py qrcode.png template.yml
root@fc-python3:/code# exit
exit
$
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
在 template.yml 所在的项目目录执行 fun install sbox,其中参数
* \-f/--function 参数指定启动 sbox 的函数,本例中函数所设定的 runtime 为 python3,所以 python3 环境的沙箱环境会被启动起来,函数 pyzbar-fun 所对应的 CodeUri 目录会被挂载到沙箱环境内部的 /code 目录,上面例子中在沙箱环境内 ls 命令返回的文件列表证实了这一点。
* \-i/--interactive 参数表示启动交互模式,对应非交互模式的用途可以看后面的示例。
如果 template.yml 文件并不存在,或者 template.yml 配置文件内的函数尚未配置可以 使用 --runtime 参数启动交互模式,此时当前目录会被挂载到沙箱环境的 /code 目录。
```
$ fun install sbox -r nodejs10 -i
root@fc-nodejs10:/code# ls
fun.yml index.py qrcode.png template.yml
root@fc-nodejs10:/code# exit
exit
$
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
上面的方法适用于临时启动一个 sbox 做些动手实验的场景。
#### 使用 fun-install 安装 apt 和 pip 依赖
```
$ fun install sbox -f pyzbar-fun -i
using template: template.yml
root@fc-python3:/code# fun-install apt-get install libblas3
Task => [UNNAMED]
=> apt-get update (if need)
=> apt-get install -y -d -o=dir::cache=/code/.fun/tmp libblas3
=> bash -c
for f in $(ls /code/.fun/tmp/archives/*.deb); do
dpkg -x $f /code/.fun/root;
mkdir -p /code/.fun/tmp/deb-control/${f%.*};
dpkg -e $f /code/.fun/tmp/deb-control/${f%.*};
if [ -f "/code/.fun/tmp/deb-control/${f%.*}/postinst" ]; then
FUN_INSTALL_LOCAL=true /code/.fun/tmp/deb-control/${f%.*}/postinst configure;
fi;
done;
=> bash -c 'rm -rf /code/.fun/tmp/archives'
root@fc-python3:/code# fun-install --help
Usage: fun local [options] [command]
build function codes or install related depedencies for Function Compute
Options:
-h, --help output usage information
Commands:
apt-get install apt depencies
pip install pip depencies
build build function codes for Function Compute
help [cmd] display help for [cmd]
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
### 非交互模式下使用 sbox
使用如下一行命令打印出 pyzbar-fun 函数的 sbox 内预装的 deb 包。
```
$ fun install sbox -f pyzbar-fun -c 'dpkg -l'
using template: template.yml
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==================================-================================-============-===============================================================================
ii acl 2.2.52-2 amd64 Access control list utilities
ii adduser 3.113+nmu3 all add and remove users and groups
ii apt 1.0.9.8.4 amd64 commandline package manager
ii apt-utils 1.0.9.8.5 amd64 package management related utility programs
ii autoconf 2.69-8 all automatic configure script builder
ii automake 1:1.14.1-4+deb8u1 all Tool for generating GNU Standards-compliant Makefiles
...(此处省略了许多行)
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
也可以通过管道将外部命令的内容传递到内部
```
$ echo hello | fun install sbox -r nodejs10 -i -c 'cat -'
hello
```
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")
注意这里 `-i` 参数不能省略,该参数表示接受标准输入。
小结
--
`fun install sbox` 是 `fcli sbox` 的替代工具,除了支持交互模式,沿用了指定 runtime 启动 sbox,也实现了 fun 风格的指定函数启动 sbox,更加便利。同时也支持内联命令和管道等非交互模式的用法,为编写脚本提供了更好的支持。
[原文链接](https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/739645%3Futm_content%3Dg_1000094672)
本文为阿里云内容,未经允许不得转载。
相关推荐
实例004——使用函数模板实现不同数据类型的极值函数 实例004——使用函数模板实现不同数据类型的极值函数 实例004——使用函数模板实现不同数据类型的极值函数
在本教程中,“vc开发GIS矢量图形系统——开发实例剖析”主要涵盖了使用Microsoft Visual C++(VC++)开发地理信息系统(GIS)中矢量图形系统的技术和实践。GIS是地理信息科学的重要组成部分,用于存储、处理、分析...
根据给定的文件信息,以下是对STM32F4函数固件库手册——新库的知识点的详细说明: 首先,手册标题中的“STM32F4函数固件库手册——新库”直接指出了本手册是关于STM32F4系列微控制器的新版函数固件库的参考资料。...
C语言实验二——函数 本实验旨在帮助学生熟悉C语言的函数编程,了解函数的定义、调用和应用。实验内容包括程序设计、程序填空和程序改错三个部分。 在程序设计部分,学生需要编写一个函数来计算并输出n(包括n)...
代码 基于遗传算法的优化计算——建模自变量降维代码代码 基于遗传算法的优化计算——建模自变量降维代码代码 基于遗传算法的优化计算——建模自变量降维代码代码 基于遗传算法的优化计算——建模自变量降维代码代码...
《初中函数图象及其性质——超级实验室》是一个利用Flash MS技术制作的多媒体教育软件,它在第十届全国多媒体教育软件大奖赛中获得了优秀奖。这个项目不仅为学生提供了直观理解函数图象及其性质的平台,同时也为教师...
【ASP网站CMS程序源码——美丽心雨CMS安装版实例开发】 ASP(Active Server Pages)是一种微软公司的服务器端脚本语言,广泛应用于Web应用程序开发,尤其是动态网站的构建。CMS(Content Management System)即内容...
算法是一个明确的指令集合,用来解决特定的问题或者计算某个函数的值。在20世纪30年代,即计算机出现之前,数学家们已经开始努力定义和研究算法的概念。这个时期形成了计算理论的基础,并且对计算机科学的后续发展...
《MATLAB 神经网络案例分析》源代码&数据
一个VC++可重用的字符串处理函数集,... 压缩包中包含StringFunctins.h和StringFunctins.cpp是字符串处理函数的头文件和实现文件,main.cpp和main.h是一个控制台应用程序的头和实现,示范字符串处理函数的使用方法。
图像处理——周长、面积计算(Matlab) 本文主要介绍图像处理技术在计算细胞数量、面积和周长方面的应用,使用 Matlab 软件实现图像处理和计算。图像处理的主要步骤包括图像灰度化、二值化、边缘检测、膨胀、填充...
计算器的实现依赖于Flash中的几个关键函数。`length()`函数能够返回一个字符串或变量的长度,例如`length("example")`将返回5,表示"example"这个字符串的字符数量。而`Number()`函数则能够将表达式转换为数字,例如...
【标题】"PHP实例开发源码——phpBB 3.1.9 繁体中文版.zip" 提供了一个基于PHP编程语言的开源讨论板软件——phpBB的源代码,版本为3.1.9,并且是繁体中文语言版本。phpBB是一个流行的网络论坛系统,用于创建在线社区...
Visual C++开发技术大全——软件工程师典藏 明日科技 源代码 解压后410M 本书是一本Visual C++ 6.0综合开发参考手册,书中几乎囊括了使用Visual C++进行程序开发的全部知识,同时在讲解中结合了大量实用而又有代表...
实例004——使用函数模板实现不同数据类型的极值函数 实例005——使用C++实现格式化数据的IO 实例006——实现数字金额的中文大写转换 实例007——将十进制数转换为二进制输出 实例008——产生随机数 实例009...
本代码主要利用MATLAB工具实现MATLAB——semilogx函数和plot函数指令对比,简单明了,易于理解
这四个版本需要相互对应,以便正确地安装和使用 TensorFlow。 TensorFlow 是一个基于数据流图的深度学习框架,它使用图来表示计算任务。图是一种抽象的数据结构,用于表示计算任务。 TensorFlow 使用会话 Session ...
总结一下,这个"JavaScript例子——计算"可能会涵盖基本的算术运算、运算符优先级、Math对象的使用、数组操作、类型转换以及可能的自定义函数设计。对于学习和提升JavaScript编程技能,这些都是非常重要的知识点。...