打包 JavaScript 微服务
本节以使用 JavaScript 开发并运行于 SylixOS 的微服务为例介绍微服务打包方法。
操作步骤
步骤 1:安装基础环境
建议安装 Visual Studio Code 开发环境进行文本编辑。
安装 Node.js 运行环境以支持容器命令行打包工具。
步骤 2:安装打包工具
在 Node.js 安装完成后,使用如下命令安装 ECS Commander(简称 ECSC)命令行工具。
npm install -g ecsc
步骤 3:生成容器 Bundle 和打包镜像
一个容器在打包前,应创建一个含有容器内 "根目录" 与 "config.json" 配置文件的目录结构,该目录结构的组合被称为容器 Bundle。用户可以使用交互方式或 Ecsfile 脚本方式生成容器 Bundle 以及打包镜像。
使用交互方式
在用户自定义的工作目录中,使用如下命令生成容器 Bundle。
D:\> cd ecs D:\ecs> ecsc create
命令执行后将启动容器 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", ……], },
将需打包的 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
参考 容器配置 配置打包模板中 config.json 配置文件的其他配额信息。容器在启动时会自动从宿主环境中获取
APP_MEM_OFFSET
环境变量并设置到容器内,该变量记录了容器应用起始虚拟地址供 JSRE 运行环境使用。执行如下命令,完成 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" 打包完成后,可在当前工作目录中得到打包后的容器镜像 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 脚本
在用户自定义的工作目录中,新建 Ecsfile 脚本文件以及待打包文件的存放目录
app
。说明:
Ecsfile 需要与
app
目录放在同一路径下。创建一个 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 指定容器的启动参数 用户使用如下的命令将需要的文件打包为 tar 包,并且会自动生成 Bundle 文件。
ecsc build /path/to/ecsfile -t HelloWorld:latest
ecsc build 命令说明:
ecsc build [Ecsfile_path] -t name[:tag]
参数说明
参数 说明 name 打包的镜像包名称 tag 镜像的标签,如 latest
Ecsfile_path Ecsfile 的文件路径 打包完成后,可在当前工作目录中得到打包后的容器镜像 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