打包 Golang 微服务

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

打包 Golang 微服务

本节以使用 Golang 开发并运行于 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 的目标设备架构,目前支持架构 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", 
              ……],
    },
    
  3. 将需打包的 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 文件,并且进行相应的配置。

  4. 参考 容器配置open in new window 配置打包模板中 config.json 配置文件的其他配额信息。

  5. 执行如下命令,完成 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"
  6. 打包完成后,可在当前工作目录中得到打包后的容器镜像 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 脚本

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

    说明:

    如果被打包的 Go 程序涉及 DNS 域名解析时,需要手动创建 resolv.conf 文件。Ecsfile 与 resolv.conf 需要与 app 目录放在同一路径下。

  2. 创建一个 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指定容器的启动参数
  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
    

    说明:

    在加载容器镜像包后,参考 容器配置open in new window 配置打包模板中 config.json 配置文件的其他配额信息。

文档内容是否对您有所帮助?
有帮助
没帮助