Funfile文件中包含了一系列命令,这些命令指定了构造函数计算交付物的步骤,Funcraft工具会执行这些步骤,最终产出交付物例如完成项目开发及打包编译后需要发布的内容。本文介绍如何通过Funfile文件安装第三方依赖。

Funfile支持的语法

Funfile支持的命令是Dockerfile的子集,Dockerfile中支持的一些命令例如COPYRUNENVUSERWORKDIR等,Funfile也都是支持的,相比较于Dockerfile命令,Funfile只需要将原来的apt-get以及pip安装的包前面加个fun-install的前缀即可。

您可以通过以下两种方式执行fun install命令验证Funfile支持的语法。
  • 将以下内容复制到Funfile文件中,函数计算可以将函数目录的package.json文件复制到容器中去执行后续操作。
    RUNTIME nodejs8
    COPY ./package.json .
    RUN npm install
  • 复杂的语法例如在函数计算中安装rlang的例子,Funfile文件内容如下。
    RUNTIME python3RUN 
    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 {} \;

使用Funfile的优势

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

操作步骤

  1. 初始化Funfile文件。
    1. 在项目目录中执行以下命令,初始化安装。
      fun install init                      
    2. 选择函数的运行环境。
      ? Select a runtime (Use arrow keys)
      > nodejs6
        nodejs8
        nodejs10
        nodejs12
        python2.7
        python3
        java8
      (Move up and down to reveal more choices)
      选择完成后,会在当前目录生成一个名为Funfile的文件。如果您的运行环境选择的是python3,则Funfile文件的内容如下:
      RUNTIME python3
      说明 由于Funfile是一个文本文件,不使用Funcraft工具进行初始化,您可以直接创建一个名为Funfile的文件,按需输入需要的运行环境。
  2. 使用Funfile文件安装依赖。
    1. 按需设置Funfile文件,如果您需要安装一个pip的Flask库,您需要将Funfile的文件内容修改为以下内容:
      RUNTIME python3
      RUN fun-install pip install flask                    
      说明 如果需要安装apt-get包依赖,您只需将pip修改为apt-get即可。
    2. 执行以下命令安装依赖。
      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