Funfile 功能介绍

简介: 前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。

前言

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

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

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

Funfile 是什么

就如同 Dockerfile 用于构造 docker 镜像,Funfile 可以用于构造函数计算的交付产物。

Funfile 中包含了一系列的命令,这些命令相当于构造函数计算交付产物一个个“步骤”,Fun 会忠实地执行这些步骤,最终产出“交付产物”。

初始化 Funfile 文件

Funfile 文件可以通过执行 fun install init 完成初始化创建。执行 fun install init,会让选择函数运行时:

$fun install init

? Select a runtime
  nodejs6
  nodejs8
 nodejs10
  python2.7
  python3
  java8
  php7.2
(Move up and down to reveal more choices)

比如,这里选择 nodejs10 后,会在当前目录生成一个名为 Funfile 的文件,内容为:

RUNTIME nodejs10

由于 Funfile 就是一个文本文件,不使用 fun 进行初始化,直接创建一个名为 Funfile 的文件,然后填写相应的内容也是可以的。

使用 Funfile 进行构建

无论是使用 fun install、还是 fun build,当操作的函数目录顶级存在 Funfile 时,都会自动执行 Funfile 的构建。

Funfile 的使用体验

举个简单场景的例子,比如要安装一个 pip 的 flask 库。除了我们在《开发函数计算的正确姿势 —— 依赖安装小结》中介绍的一些方法外,也可以通过 Funfile 进行安装。

首先第一行通过 RUNTIME 指定要安装的依赖所服务的函数 runtime,可以是 python3、python2.7、nodejs8 等等。

然后,后续的命令直接编写相关命令即可,这里只需要对 apt-get 与 pip 的依赖特殊注意下,需要在这两个命令前加上 fun-install 前缀。比如,原来安装 flask 的命令为 pip install flask,现在只需要通过 fun-install pip install flask 即可。

Funfile 内容如下: 

RUNTIME python3
RUN fun-install pip install flask

执行 fun install,可以看到输出:

$ fun install

using template: template.yml
start installing function dependencies without docker

building pyzbar-srv/pyzbar-fun
Funfile exist, Fun will use container to build forcely
Step 1/2 : FROM aliyunfc/runtime-python3.6:build-1.6.1
 ---> 2110e9fa9393
Step 2/2 : RUN fun-install pip install flask
 ---> Using cache
 ---> 992b0d65136d
sha256:992b0d65136dfa63b9566b8280881bb4cf22c4f1b68155713545e4b61ada8dd9
Successfully built 992b0d65136d
Successfully tagged fun-cache-e95a9bfa-a6fa-4d70-b5b4-0084613e2b8d:latest
copying function artifact to /Users/tan/code/fun/examples/install/pyzbar_example

could not find any manifest file for pyzbar-srv/pyzbar-fun, [install] stage for manifest will be skipped

Tips for next step
======================
* Invoke Event Function: fun local invoke
* Invoke Http Function: fun local start
* Build Http Function: fun build
* Deploy Resources: fun deploy

fun install 安装的依赖,会被安装到代码目录,这时,可以通过 fun local 相关命令进行本地调试,也可以通过 fun deploy 一键部署到云端。

Funfile 支持的语法

Funfile 的能力与 Dockerfile 是等价的,Dockerfile 中支持的一些命令例如 COPY、RUN、ENV、USER、WORKDIR 等,Funfile 也都是支持的。比如,这里我们可以将函数目录的某个文件复制到容器执行一些操作:

RUNTIME nodejs8
COPY ./package.json .
RUN npm install

我们也可以拿更复杂的语法举例,比如在函数计算中安装 ralng 的例子,Funfile 内容如下:

RUNTIME python3
RUN fun-install apt-get install libblas3
RUN fun-install pip install pandas
RUN apt-get build-dep -y r-base; \
  curl -L https://fc-demo-public.oss-cn-hangzhou.aliyuncs.com/fun/examples/R-3.5.2.tar.gz | tar -zxf -; \
  cd R-3.5.2 ;  \
  ./configure --prefix=/code/.fun/R/ --enable-R-shlib --with-blas --with-lapack ;  \
  make ;  \
  make install;
RUN PATH=/code/.fun/R/bin:$PATH LD_LIBRARY_PATH=/code/.fun/root/usr/lib/libblas:$LD_LIBRARY_PATH fun-install pip install rpy2
RUN rm -rf R-3.5.2;  \
  rm -rf .fun/root/usr/share;  \
  rm -rf .fun/R/share;  \
  rm -rf .fun/R/lib/R/doc; \
  rm -rf .fun/python/lib/python3.6/site-packages/pandas/tests; \
  rm -rf .fun/R/lib/R/library/*/{help,demo,html,doc}; \
  find .fun -type f -name "*.so" -exec strip --strip-all {} \;

相比较于原生的 Dockerfile 命令,只需要将原来的 apt-get 以及 pip 安装的包前面加个 fun-install 的前缀。

Funfile 的兼容性

(未使用过 fun.yml 的用户可以忽略该内容。)

实际上,我们在 2.0+ 的版本,已经推出过类似的功能,即 fun.yml。Funfile 其实可以看作是 fun.yml 功能的升级,因为 fun.yml 支持的语法,Funfile 也都是支持的,而 Funfile 在原来的基础上,又新增了很多特性。3.0 版本,我们会统一从 fun.yml 迁移到 Funfile。

原先使用 fun.yml 的小伙伴,也不用担心,使用 fun install 功能时,如果我们检测到旧版本的 fun.yml 文件,我们会自动将 fun.yml 转换成等价的 Funfile。如果用户需要增加新的依赖,只需要修改 Funfile 的内容即可。

使用 Funfile 的优势

  1. 通过 Funfile 描述详细的依赖安装步骤,其实更有助于“标准化”开发流程。
  2. 通过将 Funfile 而不是将具体的某些依赖提交到版本控制系统中,也更有利于函数代码的维护。
  3. Funfile 的编写,更接近原生体验,结合 fun install sbox,可以先在交互式环境进行各种尝试,然后将最终安装步骤编写到 Funfile,这个类似与 Dockerfile 的编写。
  4. Funfile 也支持 Dockerfile 的 cache 功能,如果项目的改动对 Funfile 不影响,那么 Funfile 可以利用 cache 直接跳过相应的命令执行过程。这有助于加速 Funfile 的执行过程,提升开发效率。

下面是下载 rlang 依赖的例子,第一次执行编译,需要超过 30 分钟+ 才能编译好,之后再此执行,只要不修改 Funfile 的内容,都可以在 5s 内执行完成:

相关实践学习
【玩转ComfyUI】基于函数计算一键部署AI生图平台ComfyUI
本次实验将带大家通过使用阿里云产品函数计算FC,快速使用ComfyUI实现更高质量的图像生成。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
目录
相关文章
|
3月前
|
存储 缓存 安全
synchronized 底层全解:从对象头、锁升级到内核实现,击穿并发编程的核心基石
本文深度剖析Java中synchronized的底层原理:从三种使用范式、字节码实现,到对象内存布局、Mark Word状态切换,详解锁升级(偏向→轻量→重量)全流程及JVM优化(锁消除/粗化),并结合JOL实战验证,兼顾理论深度与生产实用性。
519 2
|
人工智能 安全 Linux
开箱即用的使用体验!Alibaba Cloud Linux 的演进之旅
AI时代的到来,对操作系统带来怎样的挑战?
开箱即用的使用体验!Alibaba Cloud Linux 的演进之旅
|
IDE 数据可视化 Java
5款经典代码阅读器的使用方案对比
代码阅读是技术人的必备技能之一,高效地梳理代码能够极大程度上提高开发人员的工作效率,进一步为业务创造新价值。
15654 0
5款经典代码阅读器的使用方案对比
你真的会提交缺陷单吗?俗称报bug
你真的会提交缺陷单吗?俗称报bug
596 0
你真的会提交缺陷单吗?俗称报bug
|
编解码 供应链 搜索推荐
虚拟现实与教育:沉浸式学习的潜力
【10月更文挑战第2天】虚拟现实(VR)技术正在革新教育领域,通过沉浸式体验提升学习效果和兴趣。本文探讨了VR在教育中的应用潜力,特别是在历史、地理、自然科学和语言教育中的案例。虽然面临设备成本和技术支持等挑战,但随着技术进步和成本降低,VR有望成为教育的重要工具,带来更丰富的学习体验。
|
弹性计算 安全 Ubuntu
快速部署 Virtualmin 社区版
Virtualmin 是专为 Linux 系统设计的领先且最复杂的网络托管控制面板。本文介绍如何使用计算巢快速部署 Virtualmin 社区版。
快速部署 Virtualmin 社区版
|
存储 安全 Java
堆外内存的重要性
堆外内存的重要性
385 3
|
机器学习/深度学习 缓存 自然语言处理
采用ChatGPT大模型高效精准文档翻译
这款文档翻译工具支持PDF、Word、PPT、Excel和TXT等多种格式,利用ChatGPT大模型进行高效精准的翻译,覆盖30多种语言。它通过文档解析、预处理、翻译和结果合成步骤工作,并采用缓存、并行处理和负载均衡技术优化性能。该工具满足全球化背景下企业和个人的多语言需求,助力信息交流。
1219 1
采用ChatGPT大模型高效精准文档翻译
|
存储 缓存 NoSQL
缓存中的共享和私有缓存
【6月更文挑战第7天】本文介绍了缓存数据库的分类和作用,主要分为私有缓存和共享缓存。 不应将缓存视为关键数据的唯一来源,重要更新应同步至持久性存储。
768 3
缓存中的共享和私有缓存
|
机器学习/深度学习 人工智能 自然语言处理
大模型落地实战指南:从选择到训练,深度解析显卡选型、模型训练技、模型选择巧及AI未来展望---打造AI应用新篇章
大模型落地实战指南:从选择到训练,深度解析显卡选型、模型训练技、模型选择巧及AI未来展望---打造AI应用新篇章
大模型落地实战指南:从选择到训练,深度解析显卡选型、模型训练技、模型选择巧及AI未来展望---打造AI应用新篇章