打包 Golang 微服务
本节以使用 Golang 开发并运行于 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 的目标设备架构,目前支持架构 x86-64 以及 ARM64。
- 是否使用宿主机中的 JSRE 运行环境。
- 容器的默认启动参数。
下面以创建一个目标设备为 "arm64"、名称为 "demo"、不使用宿主机中的 JSRE 运行环境、且启动参数为 /apps/HelloVSOA" 的容器 Bundle 为例,介绍容器 Bundle 的创建过程。
_____________ _____ __ / __/ ___/ __// ___/__ __ _ __ _ ___ ____ ___/ /__ ____ / _// /___\ \ / /__/ _ \/ ' \/ ' \/ _ `/ _ \/ _ / -_) __/ /___/\___/___/ \___/\___/_/_/_/_/_/_/\_,_/_//_/\_,_/\__/_/ ? What is name for the bundle (directory)? demo ? What is the architecture(s) of the bundle? arm64 ? Would you mount and reuse JSRE from the container host? No ? What is the start parameter (process.args) of the image? /apps/HelloVSOA + 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 栈大小,以满足运行 Go 应用默认 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", ……], },
将需打包的 Go 可执行文件手动拷贝至 Bundle 内,如将
HelloVSOA
拷贝至 "ecs/demo/rootfs/apps" 目录中。D:\ecs> dir demo\rootfs\apps 驱动器 D 中的卷是 Data 卷的序列号是 32DC-66F6 D:\ecs\demo\rootfs\apps 的目录 2023/03/21 16:28 <DIR> . 2023/03/21 16:20 <DIR> .. 2023/03/21 16:28 1,901 HelloVSOA
说明:
如果被打包的 Go 程序涉及 DNS 域名解析时,需要在
etc
目录下手动创建 resolv.conf 文件,并且进行相应的配置。参考 容器配置 配置打包模板中 config.json 配置文件的其他配额信息。
执行如下命令,完成 Golang 微服务打包。
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/21 16:32 <DIR> . 2023/03/21 15:34 <DIR> .. 2023/03/21 16:20 <DIR> demo 2023/03/21 16:32 1,921 demo.tar
使用 Ecsfile 脚本
在用户自定义的工作目录中,新建 Ecsfile 脚本文件以及待打包文件的存放目录
app
。说明:
如果被打包的 Go 程序涉及 DNS 域名解析时,需要手动创建 resolv.conf 文件。Ecsfile 与 resolv.conf 需要与
app
目录放在同一路径下。创建一个 Ecsfile 脚本文件并按需配置,下面以打包一个目标设备为 "arm64"、名称为 "HelloWorld"、自动映射 "/lib" 目录和 "/dev" 目录,涉及 DNS 域名解析且启动参数为 "/apps/HelloWorld" 的容器镜像为例,介绍使用 Ecsfile 打包一个 Go 镜像的过程。
ARCH arm64 MOUNT /lib /lib rx MOUNT /dev /dev rx COPY ./app/HelloWorld /apps/hello/HelloWorld COPY ./resolv.conf /etc/resolv.conf 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 /apps/HelloWorld
配置说明
配置项 说明 ARCH 指定容器待运行的目标设备架构。其中,ARCH 可配置的参数有:x86-64, arm64 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
说明:
在加载容器镜像包后,参考 容器配置 配置打包模板中 config.json 配置文件的其他配额信息。