首先介紹下在本文出現的幾個比較重要的概念:php
函數計算(Function Compute): 函數計算是一個事件驅動的服務,經過函數計算,用戶無需管理服務器等運行狀況,只需編寫代碼並上傳。函數計算準備計算資源,並以彈性伸縮的方式運行用戶代碼,而用戶只需根據實際代碼運行所消耗的資源進行付費。函數計算更多信息 參考。
Fun: Fun 是一個用於支持 Serverless 應用部署的工具,能幫助您便捷地管理函數計算、API 網關、日誌服務等資源。它經過一個資源配置文件(template.yml),協助您進行開發、構建、部署操做。Fun 的更多文檔 參考。html
備註: 本文介紹的技巧須要 Fun 版本大於等於 3.0.0+。java
就如同 Dockerfile 用於構造 docker 鏡像,Funfile 能夠用於構造函數計算的交付產物。node
Funfile 中包含了一系列的命令,這些命令至關於構造函數計算交付產物一個個「步驟」,Fun 會忠實地執行這些步驟,最終產出「交付產物」。python
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
不管是使用 fun install、仍是 fun build,當操做的函數目錄頂級存在 Funfile 時,都會自動執行 Funfile 的構建。npm
舉個簡單場景的例子,好比要安裝一個 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 的能力與 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 的前綴。
(未使用過 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 的內容便可。
下面是下載 rlang 依賴的例子,第一次執行編譯,須要超過 30 分鐘+ 才能編譯好,以後再此執行,只要不修改 Funfile 的內容,均可以在 5s 內執行完成:
本文爲雲棲社區原創內容,未經容許不得轉載。