
# 制作镜像包或插件包
![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/caution_3.0-zh-cn.png)
若制作镜像包以容器化方式部署应用，不支持在一个容器内运行多个集成ModuleSDK的软件进程或者重启集成ModuleSDK的软件进程，会导致鉴权失败等问题。
 #### 镜像包打包
1. **构建需要打包的项目**
   
   构建项目，此处示例，构建好的文件存放在目录 /home/ModuleSDK-Demo 下
   
   
2. **安装docker**
   
   请确认您使用的系统已经安装Docker(Docker版本需要高于17.06，推荐18.06)，安装方法可参照[docker 安装教程](https://docs.docker.com/install/overview/)。
   
   
3. **制作镜像**
   
   1. 搜索基础镜像。
      ```
      docker search dotnet
      ```
      
   
   2. 根据您的工程配置，选择合适的镜像。
      ![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/caution_3.0-zh-cn.png)
      镜像需要集成与您的工程配置兼容的.Net运行环境，下文使用的.Net版本仅作演示。
      
   
   3. 拉取镜像。
      ```
      docker pull mcr.microsoft.com/dotnet/runtime:2.1
      ```
      ![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/note_3.0-zh-cn.png)
      **mcr.microsoft.com/dotnet/runtime:2.1** 镜像是微软提供的镜像，非IoT团队发布，且IoT团队未提供任何官方镜像。该镜像在此仅做示例，IoT团队对该镜像的安全性不作保证，强烈建议用户自己封装镜像！
      
   
   4. 编写 Dockerfile 制作镜像。 创建 Dockerfile，内容示例如下（具体可参考[编写高效的Dockerfile](https://support.huaweicloud.com/bestpractice-swr/swr_bestpractice_0002.html) ）。
      ![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/notice_3.0-zh-cn.png)
      下面提供了ModuleSDK-Demo镜像构建样例，仅作示例展示，请按需修改。
      ```
      # 基础镜像来源
      FROM mcr.microsoft.com/dotnet/runtime:2.1
      # 指定工作目录
      WORKDIR /app
      # 复制工程二进制文件和相关文件（即项目构建发布的产物）
      COPY ModuleSDK-Demo/ /app
      ENTRYPOINT ["dotnet", "ModuleSDK-Demo.dll"]
      ```
      
   
   5. 构建镜像
      ```
      docker build -t modulesdk-demo:1.0.0 -f Dockerfile .
      ```
      
   
   6. 查看打包完成的镜像
      ```
      docker images
      ```
      可以看到**modulesdk-demo** 这个镜像已经制作完成。
      ```
      REPOSITORY       TAG         IMAGE ID       CREATED         SIZE
      modulesdk-demo   1.0.0     85ed3c3dc738   8 minutes ago    182MB
      ```
      
   
   
   ![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/note_3.0-zh-cn.png)
   上述步骤演示的是直接复制已编译好的工程文件来构建镜像，您也可以采取在构建镜像时编译的方式，具体可参照[.Net 官方文档](https://learn.microsoft.com/zh-cn/dotnet/core/docker/build-container?tabs=linux#create-a-container)的指引。
   
   
4. **镜像上传**
   
   1. 上传镜像 镜像上传需要使用镜像容器服务(SWR)，首先需要开通容器镜像服务(SWR)。开通及使用请参照[容器镜像服务(SWR)](https://support.huaweicloud.com/usermanual-swr/swr_01_0009.html)。
      
   
   2. 获取 SWR 登录指令 获取登录指令请参照[获取指令](https://support.huaweicloud.com/usermanual-swr/swr_01_1000.html)。
      ![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/note_3.0-zh-cn.png)
      访问密钥即AK/SK（Access Key ID/Secret Access Key），获取的AK/SK将用于登录。
      
   
   3. 登录 SWR 仓库
      ```
      docker login -u [区域项目名]@[AK] -p [登录密钥] [镜像仓库地址]
      ```
      可以直接从[控制台](https://console.huaweicloud.com/swr/#/app/dashboard)获取登录命令，如下图。
      ![](https://support.huaweicloud.com/devg-iotedge/figure/zh-cn_image_0000001362649504.png "点击放大")
      ![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/note_3.0-zh-cn.png)
      镜像仓库地址 = swr.区域项目名称.myhuaweicloud.com
      例如，华北-北京一对应的镜像仓库地址为：swr.cn-north-1.myhuaweicloud.com
      
   
   4. 修改镜像所属组织 修改镜像的组织名，以便推送到个人组织内。
      ```
      docker tag [OPTIONS] [镜像名:版本号] [镜像仓库地址/所属组织/镜像名:版本号]
      ```
      例如：
      ```
      docker tag modulesdk-demo:1.0.0 swr.cn-north-4.myhuaweicloud.com/iotedge/modulesdk-demo:1.0.0
      ```
      
   
   5. 上传镜像
      ```
      docker push [镜像仓库地址/所属组织/镜像名:版本号]
      ```
      例如：
      ```
      docker push swr.cn-north-4.myhuaweicloud.com/iotedge/modulesdk-demo:1.0.0
      ```
      
   
   6. 在[我的镜像](https://console.huaweicloud.com/swr/#/app/warehouse/list)查看上传结果
      ![](https://support.huaweicloud.com/devg-iotedge/figure/zh-cn_image_0000001416267413.png "点击放大")
      
   
   7. 上传镜像后请在 SWR 将镜像设置为公开。 查看镜像详情：
      ![](https://support.huaweicloud.com/devg-iotedge/figure/zh-cn_image_0000001364707976.png "点击放大")
      编辑镜像：
      ![](https://support.huaweicloud.com/devg-iotedge/figure/zh-cn_image_0000001365188256.png "点击放大")
      设置为公开：
      ![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/caution_3.0-zh-cn.png)
      这一步很重要，关系到后面能否正常部署应用。
      ![](https://support.huaweicloud.com/devg-iotedge/figure/zh-cn_image_0000001364708712.png "点击放大")
      
   
   
   
   
 
 #### 插件包打包
1. **插件包制作**
   
   1. **插件包格式要求**
      插件包仅支持.tar.gz 、.tar或者 .zip格式。
      插件包结构如下：
      ModuleSDK-Demo.zip
      ├── ModuleSDK-Demo.\*\*\* // 可执行文件
      ├── \*\*\*.dll // 外部库文件，在构建发布时产生，可能会有多个
      ├── start.sh // 启动脚本 必须文件 当前不提供参数方式启动
      └── stop.sh // 停止脚本 非必须
      ![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/note_3.0-zh-cn.png)
      ModuleSDK-Demo.\*\*\* 为可执行文件，类型可能为.dll或.exe，取决于您的工程发布配置。下文将以ModuleSDK-Demo.dll为例。
      
   
   2. **添加启动脚本**
      在可执行文件ModuleSDK-Demo.dll的同一目录下创建启动脚本start.sh，内容示例如下，可根据您的需要进行修改。
      ```
      function log(){
          echo "`date "+%Y-%m-%d %T"`: $1"
      }
      log "[INFO] start execut process."
      pwd
      dotnet ModuleSDK-Demo.dll > ModuleSDK_demo_running.log 2>&1
      ```
      
   
   3. **打包插件包**
      压缩文件得到ModuleSDK-Demo.zip。
      
   
   
   
   
2. **插件包上传**
   
   1. **开通对象存储服务OBS**
      进程包上传方式需要开通对象存储服务OBS，请参考[对象存储服务 OBS_快速入门](https://support.huaweicloud.com/qs-obs/obs_qs_0001.html)
      
   
   2. **上传进程包**
      上传方式请参照[对象存储服务(OBS)](https://console.huaweicloud.com/console/#/obs/manager/buckets)。
      ![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/caution_3.0-zh-cn.png)
      请设置桶策略为【公开读】，如未设置请前往"OBS首页 \> 单击桶ID \> 访问权限控制 \> 桶策略中设置"。
      
   
   
   
   
 
