Funfile 功能介紹

前言

首先介紹下在本文出現的幾個比較重要的概念:php

函數計算(Function Compute): 函數計算是一個事件驅動的服務,經過函數計算,用戶無需管理服務器等運行狀況,只需編寫代碼並上傳。函數計算準備計算資源,並以彈性伸縮的方式運行用戶代碼,而用戶只需根據實際代碼運行所消耗的資源進行付費。函數計算更多信息 參考
Fun: Fun 是一個用於支持 Serverless 應用部署的工具,能幫助您便捷地管理函數計算、API 網關、日誌服務等資源。它經過一個資源配置文件(template.yml),協助您進行開發、構建、部署操做。Fun 的更多文檔 參考html

備註: 本文介紹的技巧須要 Fun 版本大於等於 3.0.0+。java

Funfile 是什麼

就如同 Dockerfile 用於構造 docker 鏡像,Funfile 能夠用於構造函數計算的交付產物。node

Funfile 中包含了一系列的命令,這些命令至關於構造函數計算交付產物一個個「步驟」,Fun 會忠實地執行這些步驟,最終產出「交付產物」。python

初始化 Funfile 文件

Funfile 文件能夠經過執行 fun install init 完成初始化建立。執行 fun install init,會讓選擇函數運行時:git

$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 的文件,內容爲:github

RUNTIME nodejs10

因爲 Funfile 就是一個文本文件,不使用 fun 進行初始化,直接建立一個名爲 Funfile 的文件,而後填寫相應的內容也是能夠的。docker

使用 Funfile 進行構建

不管是使用 fun install、仍是 fun build,當操做的函數目錄頂級存在 Funfile 時,都會自動執行 Funfile 的構建。npm

Funfile 的使用體驗

舉個簡單場景的例子,好比要安裝一個 pip 的 flask 庫。除了咱們在《開發函數計算的正確姿式 —— 依賴安裝小結》中介紹的一些方法外,也能夠經過 Funfile 進行安裝。json

首先第一行經過 RUNTIME 指定要安裝的依賴所服務的函數 runtime,能夠是 python三、python2.七、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 內執行完成:

 

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索