层可以为您提供自定义的公共依赖库、运行时环境及函数扩展等发布与部署能力。您可以将函数依赖的公共库提炼到层,以减少部署、更新时的代码包体积。本文介绍层的功能原理、各运行时使用层说明以及如何构建层的ZIP包。
功能原理
- 构建层时,需要将所有内容打包到ZIP文件中。函数计算运行时会将层的内容解压并部署在/opt目录下。
- 当函数配置多个层时,这些层的内容将被合并至/opt目录,多个层按照层配置的逆序合并。如果多个层中有同名文件,先配置的层会覆盖后配置的层中的同名文件。
- 如果层中的代码依赖二进制的库或可执行文件,则需要使用Linux系统编译构建层,推荐使用Debian 9。
- 如果层中的库对指令集有依赖,请使用amd64架构的机器,或者通过交叉编译的方式确保库与函数计算运行时的兼容性。
各运行时的层文件目录与文件结构
对于支持层功能的运行时,函数计算会将特定的目录添加到运行时语言的依赖包搜索路径中,如下表所示。如果在层ZIP包中定义了与其相同的文件夹结构,则函数代码无需指定路径即可访问层。
各运行时支持添加的特定目录
运行时 | 特定的目录 |
---|---|
Python | /opt/python |
Node.js | /opt/nodejs/node_modules |
Java | /opt/java/lib |
PHP | /opt/php |
除Custom Runtime和Custom Container之外的运行时 | /opt/bin (PATH) |
/opt/lib (LD_LIBRARY_PATH) |
各运行时的层ZIP包文件结构
使用
requests 依赖打包后的文件结构my-layer-code.zip └── python └── requests ZIP包解压部署后的路径
/ └── opt └── python └── requests
使用
uuid 依赖打包后的文件结构my-layer-code.zip └── nodejs ├── node_modules │ └── uuid ├── package-lock.json └── package.json ZIP包解压部署后的路径
/ └── opt └── nodejs ├── node_modules │ └── uuid ├── package-lock.json └── package.json
使用
jackson-core 依赖打包后的文件结构my-layer-code.zip └── java └── lib └── commons-lang3-3.12.0.jar ZIP包解压部署后的路径
/ └── opt └── java └── lib └── commons-lang3-3.12.0.jar
使用
composer 依赖打包后的文件结构my-layer-code.zip └── php ├──composer.json ├──composer.lock └──vendor ZIP包解压部署后的路径
/ └── opt └── php ├──composer.json ├──composer.lock └──vendor
构建层的ZIP包
创建层时,需要将所有内容打包到ZIP文件中。函数计算运行时会将层的内容解压并部署在/opt目录下。
构建层的ZIP包的方式和构建代码包的方式类似,为使函数在运行时能正确加载以层发布的库,库的代码目录结构需遵从各个语言标准的目录规范,具体信息,请参见各运行时的层文件目录与文件结构。对于部署于层的函数依赖库,如果按照规范的方式打包,函数计算运行时会为您自动添加各语言的依赖库搜索路径,您无需指定全路径。如您想自定义层的目录结构,需要在代码中显式添加依赖库搜索地址。具体操作步骤,请参见如何在Custom Runtime中引用层中的依赖?。
各运行时构建层ZIP包的操作步骤如下所示: