打包 JavaScript 微服务

更新时间:
2024-03-27
下载文档

打包 JavaScript 微服务

本节以使用 JavaScript 开发并运行于 SylixOS 的微服务为例介绍微服务打包方法。

操作步骤

步骤 1:安装基础环境

  1. 建议安装 Visual Studio Codeopen in new window 开发环境进行文本编辑。

  2. 安装 Node.jsopen in new window 运行环境以支持容器命令行打包工具。

步骤 2:安装打包工具

在 Node.js 安装完成后,使用如下命令安装 ECS Commander(简称 ECSC)命令行工具。

npm install -g ecsc

步骤 3:生成容器 Bundle 和打包镜像

一个容器在打包前,应创建一个含有容器内 "根目录" 与 "config.json" 配置文件的目录结构,该目录结构的组合被称为容器 Bundle。用户可以使用交互方式或 Ecsfile 脚本方式生成容器 Bundle 以及打包镜像。

使用交互方式

  1. 在用户自定义的工作目录中,使用如下命令生成容器 Bundle。

    D:\> cd ecs
    D:\ecs> ecsc create
    
  2. 命令执行后将启动容器 Bundle 生成交互流程,用户需回答以下问题:

    • 创建的容器 Bundle 名称。

    • 容器 Bundle 的目标设备架构,目前支持的架构有 noarch、x86-64、ARM64、ARM、RISC-V64、MIPS64、PowerPC 和 LoongArch,其中 noarch 表示该容器可以在多平台架构下运行。

    • 是否使用宿主机中的 JSRE 运行环境,该操作会将容器内的“/lib”目录和“/bin/javascript”文件自动映射至宿主机的“/lib”目录和“/bin/javascript”文件,映射权限均为“只读可执行”。

      说明:

      直接映射使用宿主机的 JSRE 运行时环境可以极大地缩小 JavaScript 应用容器的镜像体积;但如果宿主机的运行时环境版本各不相同,则可能导致容器迁移失败,此时用户应考虑自行将需要的 JSRE 版本打包进入容器镜像,从而解除应用与宿主环境的依赖关系。

    • 容器的默认启动参数。

    下面以创建一个目标设备为 "x86-64"、名称为 "demo"、自动映射 "/lib" 目录,且启动参数为 "javascript /apps/HelloVSOA.js" 的容器 Bundle为例,介绍容器 Bundle 的创建过程。

       _____________ _____                              __       
       / __/ ___/ __// ___/__  __ _  __ _  ___ ____  ___/ /__ ____
       / _// /___\ \ / /__/ _ \/  ' \/  ' \/ _ `/ _ \/ _  / -_) __/
    /___/\___/___/ \___/\___/_/_/_/_/_/_/\_,_/_//_/\_,_/\__/_/   
    
    ? What is the name for the bundle (directory)? demo
    ? What is the architecture(s) of the bundle? x86-64
    ? Would you mount and reuse JSRE from the container host? Yes
    ? What is the start parameter (process.args) of the image? javascript /apps/HelloVSOA.js
    + created demo\config.json
    + created demo\rootfs\etc\startup.sh
    + created demo\rootfs\apps
    + created demo\rootfs\home
    + created demo\rootfs\bin
    + created demo\rootfs\qt
    + created demo\rootfs\boot
    + created demo\rootfs\dev
    + created demo\rootfs\lib
    + created demo\rootfs\proc
    + created demo\rootfs\root
    + created demo\rootfs\sbin
    + created demo\rootfs\tmp
    + created demo\rootfs\usr
    + created demo\rootfs\var
    + done!
    

    Bundle 将在当前工作目录中被创建成功。

    说明:

    • 创建 Bundle 时,会自动在 /etc/startup.sh 中添加了如下命令设置容器的默认 Shell 栈大小,以满足运行 JavaScript 应用默认 Shell 栈大小需大于 128 KB + 64 KB 的要求。
    shstack 200000
    
    • 创建 Bundle 时,config.json 配置文件中的 "process.env" 将会自动添加容器内云原生 SDK 库的路径配置:
    "process": {
      "env":  ["LD_LIBRARY_PATH=/qt/lib:/usr/lib:/lib:/usr/local/lib:/lib/jsre:/lib/vsoa", 
              ……],
    },
    
  3. 将需打包的 JavaScript 文件手动拷贝至 Bundle 内,如将 HelloVSOA.js 拷贝至 "ecs/demo/rootfs/apps" 目录中。

    D:\ecs> dir demo\rootfs\apps
    驱动器 D 中的卷是 Data
    卷的序列号是 32DC-66F6
    
    D:\ecs\demo\rootfs\apps 的目录
    
    2023/03/06  19:44    <DIR>          .
    2023/03/06  19:38    <DIR>          ..
    2023/03/06  19:44               101 HelloVSOA.js
    
  4. 参考 容器配置 配置打包模板中 config.json 配置文件的其他配额信息。容器在启动时会自动从宿主环境中获取 APP_MEM_OFFSET 环境变量并设置到容器内,该变量记录了容器应用起始虚拟地址供 JSRE 运行环境使用。

  5. 执行如下命令,完成 JavaScript 微服务打包。

    D:\ecs> ecsc pack demo -t demo:latest demo.tar
    

    ecsc pack 命令说明:

    ecsc pack <bundle> [-t name[:tag]] [tarball_path]
    

    参数说明

    参数说明
    bundle待打包的 Bundle 路径
    name打包的镜像包名称
    tag镜像的标签,如 latest
    tarball_path打包镜像生成路径,后缀必须为 ".tar"
  6. 打包完成后,可在当前工作目录中得到打包后的容器镜像 demo.tar。

    D:\ecs> dir
    驱动器 D 中的卷是 Data
    卷的序列号是 32DC-66F6
    
    D:\ecs 的目录
    
    2023/03/06  19:52    <DIR>          .
    2023/03/06  18:34    <DIR>          ..
    2023/03/06  19:38    <DIR>          demo
    2023/03/06  19:48            30,720 demo.tar
    

使用 Ecsfile 脚本

  1. 在用户自定义的工作目录中,新建 Ecsfile 脚本文件以及待打包文件的存放目录app

    说明:

    Ecsfile 需要与 app 目录放在同一路径下。

  2. 创建一个 Ecsfile 脚本文件并按需配置,下面以打包一个目标设备为 "arm64"、名称为 "HelloWorld"、自动映射 "/lib" 目录,且启动参数为 "javascript ./hello/HelloVSOA.js" 的容器镜像为例,介绍使用 Ecsfile 打包一个镜像的过程。

    ARCH arm64
    
    MOUNT /bin/javascript /bin/javascript rx
    
    MOUNT /lib /lib rx
    
    MOUNT /qt /qt rx
    
    COPY ./app/HelloWorld.js /apps/hello/HelloWorld.js
    
    ENV PATH=/usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin
    
    ENV LD_LIBRARY_PATH=/qt/lib:/usr/lib:/lib:/usr/local/lib:/lib/jsre:/lib/vsoa
    
    WORKDIR /apps/hello
    
    CMD javascript ./hello/HelloWorld.js
    

    配置说明

    配置项说明
    ARCH指定容器待运行的目标设备架构。其中,ARCH 可配置的参数有:noarch, x86-64, arm64, arm, riscv64, mips64, ppc, loongarch。其中 noarch 表示该容器可以在多平台架构下运行
    MOUNT参数一指定宿主机的运行环境,参数二指定容器内的运行环境,参数三指定映射权限。此条指令用于将宿主机的运行环境映射至容器中
    COPY参数一指定需要打包的文件路径,参数二指定容器 Bundle 内的路径。此条指令用于将参数一指定的路径下文件拷贝至容器 Bundle 内
    ENV指定需要声明的环境变量
    WORKDIR指定容器的工作路径
    CMD指定容器的启动参数
  3. 用户使用如下的命令将需要的文件打包为 tar 包,并且会自动生成 Bundle 文件。

    ecsc build /path/to/ecsfile -t HelloWorld:latest
    

    ecsc build 命令说明:

    ecsc build [Ecsfile_path] -t name[:tag]
    

    参数说明

    参数说明
    name打包的镜像包名称
    tag镜像的标签,如 latest
    Ecsfile_pathEcsfile 的文件路径
  4. 打包完成后,可在当前工作目录中得到打包后的容器镜像 HelloWorld.arm64.tar。

    D:\ecs> dir
    驱动器 D 中的卷是 Data
    卷的序列号是 32DC-66F6
    
    D:\ecs 的目录
    
    2024/03/16  15:52    <DIR>          .
    2024/03/16  15:34    <DIR>          ..
    2024/03/16  18:38    <DIR>          HelloWorld
    2024/03/16  18:48              1365 HelloWorld.arm64.tar
    
文档内容是否对您有所帮助?
有帮助
没帮助