当您需要使用PIP包或者APT包的功能时,您可以通过fun install安装。本文介绍如何通过fun install命令安装PIP包及APT包的操作步骤。

获取fun install命令下的功能

执行以下命令,获取fun install命令下的相关功能。
fun install -h
预期输出:
Usage: fun install [-f|--function <[service/]function>] [-r|--runtime <runtime>] [-p|--package-type <type>] [--save] [-e|--env key=val ...] [packageNames...]

install dependencies which are described in fun.yml file.

Options:
  -f, --function <[service/]function>  Specify which function to execute installation task.
  -e, --env <env>                      environment variable, ex. -e PATH=/code/bin (default: [])
  -d, --use-docker                     Use docker container to install function dependencies
  -r, --runtime <runtime>              function runtime, avaliable choice is: nodejs6, nodejs8, nodejs10,
                                       nodejs12, python2.7, python3, java8, php7.2, dotnetcore2.1, custom
  -p, --package-type <type>            avaliable package type option: pip, apt, npm.
  --save                               add task to fun.yml file.
  --registry <npm-url>                 Configure npm to use any compatible registry, and even run your own
                                       registry.
  --index-url <pip-url>                Base URL of Python Package Index (default https://pypi.org/simple). This should point to a repository compliant with PEP 503 (the simple repository API) or a local
                                       directory laid out in the same format.
  -h, --help                           display help for command

Commands:
  init                                 initialize fun.yml file.
  env                                  print environment varables.
  sbox [options]                       Start a local sandbox for installation dependencies or
                                       configuration

安装PIP包依赖

安装操作

本文以Python为例,在您需要安装PIP包依赖的文件夹中,执行以下命令安装Python的PIP包。
fun install --runtime python2.7 --package-type pip tensorflow  
说明
  • 根据实际情况修改相应的运行环境。
  • 您可以自定义PIP包的名称,本文以tensorflow为例。
预期输出:
skip pulling image aliyunfc/runtime-python2.7:build-1.2.0...
Task => [UNNAMED]
     => PYTHONUSERBASE=/code/.fun/python pip install --user tensorflow 
参数说明如下:
  • --runtime:指定运行的环境。
    说明fun.yml里已经声明运行环境,说明文件已经被初始化,您可以省略该选项。
  • --package-type:指定安装依赖的类型。目前仅支持PIP和APT。
  • PYTHONUSERBASE=/code/.fun/python pip install --user tensorflow:命令在FC-Docker提供的容器内部执行,执行的命令会逐行打印出来。

安装结果

安装完成PIP包以后会再生成一个.fun目录。
  • .fun/python/bin:可执行文件被放置的目录。
  • .fun/python/lib/python2.7/site-packages:库文件放置的目录。
文件存放结构如下所示:
.fun
└── python
    ├── bin
    │   ├── freeze_graph
    │   ├── markdown_py
    │   ├── pbr
    │   ├── saved_model_cli
    │   ├── tensorboard
    │   ├── tflite_convert
    │   ├── toco
    │   └── toco_from_protos
    └── lib
        └── python2.7
            └── site-packages
                ├── tensorboard
                ├── tensorboard-1.12.2.dist-info
                ├── tensorflow
                ├── tensorflow-1.12.0.dist-info
                ├── termcolor-1.1.0.dist-info
                ...            
pip install -t . <package-name>方式相比,使用fun install安装文件的优点如下:
  • 存放位置更有组织性。
  • 依赖文件和代码文件分离开,便于借助OSS或NAS初始化依赖文件。

安装成功后,库文件无法被程序找到,您需要自定义环境变量,关于如何配置函数计算的环境变量,请参见配置环境变量。您可以执行以下命令获取相应的环境变量。

fun install env           
预期输出:
LD_LIBRARY_PATH=/code/.fun/root/usr/local/lib:/code/.fun/root/usr/lib:/code/.fun/root/usr/lib/x86_64-linux-gnu:/code/.fun/root/usr/lib64:/code/.fun/root/lib:/code/.fun/root/lib/x86_64-linux-gnu:/code/.fun/root/python/lib/python2.7/site-packages:/code/.fun/root/python/lib/python3.6/site-packages:/code:/code/lib:/usr/local/lib
PATH=/code/.fun/root/usr/local/bin:/code/.fun/root/usr/local/sbin:/code/.fun/root/usr/bin:/code/.fun/root/usr/sbin:/code/.fun/root/sbin:/code/.fun/root/bin:/code:/code/node_modules/.bin:/code/.fun/python/bin:/code/.fun/node_modules/.bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/sbin:/bin
NODE_PATH=/code/node_modules:/usr/local/lib/node_modules
PYTHONUSERBASE=/code/.fun/python
说明 如果您是使用fun localfun deploy进行调试和部署的,您无需配置环境变量,Funcraft工具已经帮您设定好了。

后续操作

  • 保存文件
    如果您需要将命令永久保存在Funfile文件中。您可以执行以下命令。
    fun install --runtime python2.7 --package-type pip --save tensorflow                  
    预期输出:
    skip pulling image aliyunfc/runtime-python2.7:build-1.2.0...
    Task => [UNNAMED]     
    => PYTHONUSERBASE=/code/.fun/python pip install --user tensorflow 
  • 查看日志
    如果您需要查看详细日志。您可以执行以下命令。
    fun install -v
    预期输出:
    skip pulling image aliyunfc/runtime-python3.6:build-1.2.0...
    Task => [UNNAMED]
         => apt-get update (if need)
    Ign http://mirrors.aliyun.com stretch InRelease
    Get:1 http://mirrors.aliyun.com stretch-updates InRelease [91.0 kB]
    Get:2 http://mirrors.aliyun.com stretch-backports InRelease [91.8 kB]
    Get:3 http://mirrors.aliyun.com stretch/updates InRelease [94.3 kB]
    Hit http://mirrors.aliyun.com stretch Release.gpg
    Hit http://mirrors.aliyun.com stretch Release
    Get:4 http://mirrors.aliyun.com stretch-updates/main Sources [3911 B]
    ....                   

安装APT包依赖

执行以下命令安装APT包。

fun install --runtime python3 --package-type apt libzbar0          
预期输出:
skip pulling image aliyunfc/runtime-python3.6:build-1.9.6...
Task => AptTask
     => sudo apt-get update (if need)
     => apt-get install -y -d -o=dir::cache=/code/.fun/tmp/install libzbar0 --reinstall --no-install-recommends
     => bash -c
        for f in $(ls /code/.fun/tmp/install/archives/*.deb); do
          echo "Preparing to unpack ${f##*/}"
          dpkg -x $f /code/.fun/root;

          echo "Setting up ${f##*/}"
          mkdir -p /code/.fun/tmp/install/deb-control/${f%.*};
          dpkg -e $f /code/.fun/tmp/install/deb-control/${f%.*};
          if [ -f "/code/.fun/tmp/install/deb-control/${f%.*}/postinst" ]; then
            FUN_INSTALL_LOCAL=true DPKG_MAINTSCRIPT_NAME=postinst /code/.fun/tmp/install/deb-control/${f%.*}/postinst configure;
          fi;
        done;
     => bash -c 'rm -rf /code/.fun/tmp/install/archives'
注意 APT包的安装方式及其参数和PIP包依赖类似,只需要将pip修改为apt。APT的包名使用apt-get可以安装的DEB格式的包名即可。