减持|玩转 serverless devs 的三种部署方式( 二 )


Custom Container 部署
刚刚我们已经通过 Custom Runtime 部署 来自定义代码的运行时了 , 但是即使通过那种方式 , 我们也无法改变代码运行的容器环境 。 比如我有一段代码 , 只有在 Windows 的 IIS 上才能运行 , 怎么办? 显然 Custom Runtime 部署 固定的容器环境 , 是不满足我们的需求的 。
这时候我们就需要在本地 , 构建我们自己的容器镜像 , 并把它推送到 阿里云的镜像仓库 里去 。 所以启用 Custom Container 部署  , 最重要的先决条件是什么?
安装 docker 并 开通阿里云容器镜像服务
它对应的 serverless-devs 也非常简单:
function:  caPort: 9000  runtime: custom-container  customContainerConfig:    image: registry.cn-hangzhou.aliyuncs.com/som-custom-container/nest-appactions:   pre-deploy: # 在部署前执行 , 在你的本地构建镜像 , 所以需要你已经安装好了 docker    - component: fc build --use-docker --dockerfile ./code/Dockerfile
customContainerConfig#image 就是你的镜像仓库的地址(我示例中用的公网地址 , 最佳实践为函数计算同地域的VPC镜像地址) , 复制粘贴即可 。
fc build --use-docker --dockerfile ./code/Dockerfile 这个命令 , 你可以理解成一堆 docker 构建发布的命令脚本 。
而 Dockerfile 就是构建镜像的核心了 , 在这里我们可以任意的配置我们的系统环境 。 比如我们要转化操作图集变成pdf文件 , 则预先安装好 ghostscript 。
我们要在 nodejs runtime 中构建类似 Canvas 实现 , 额外安装 build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev.....
这里给出一个 Dockerfile 示例参考:
FROM node:18-alpineRUN mkdir -p /usr/src/botWORKDIR /usr/src/botCOPY package.json yarn.lock /usr/src/bot/# 注册 alpinelinux 镜像地址防止下载过慢RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \\  && apk add --no-cache \\  build-base \\  g++ \\  cairo-dev \\  jpeg-dev \\  pango-dev \\  giflib-dev  \\  && apk add --update  --repository http://dl-3.alpinelinux.org/alpine/edge/testing \\  libmount \\  ttf-dejavu \\  ttf-droid \\  ttf-freefont \\  ttf-liberation \\  fontconfig \\  && yarn --prodCOPY ./src /usr/src/bot/srcEXPOSE 9000ENTRYPOINT [\"yarn\" \"start\"

这种部署方式最灵活 , 能做到很多上述2个部署方式做不到的事情 , 但是它的冷启动速度也是最慢的 。 原因在于 , 容器镜像依赖的基础环境和应用很容易臃肿 , 这带来了额外的数据下载和解压的时间 。 所以这种部署方式上生产环境 , 往往很多措施来辅助 , 比如 镜像启动加速 , 预留实例 和 单实例多并发 等等功能 , 同时自己在构建时也要做一定的优化 , 详见
结论

  1. 灵活性(从低到高)
  • 单语言&普通的 CRUD -> 预置 Runtime 部署
  • 自定义语言or运行版本 -> Custom Runtime 部署
  • 自定义容器环境 -> Custom Container 部署
  1. 冷启动速度(从慢到快)/优化成本(从高到低)