
# 制作镜像包或插件包
![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/caution_3.0-zh-cn.png)
若制作镜像包以容器化方式部署应用，不支持在一个容器内运行多个集成ModuleSDK的软件进程或者重启集成ModuleSDK的软件进程，会导致鉴权失败等问题。
 #### 镜像包打包
1. 上传需要打包的项目。将项目上传到网络能访问到的Linux机器上，放到目录下（比如 /home/MyCApp）。
2. 安装docker。 
   请确认使用的系统已经安装docker(docker版本需要高于17.06，推荐18.06)，安装方法可参照[docker 安装教程](https://docs.docker.com/install/overview/)。
   
   
3. 制作镜像。 
   1. 搜索基础镜像。
      ![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/note_3.0-zh-cn.png)
      对基础镜像没有要求，可自行选择合适的基础镜像，以下选用带cmake的镜像作为示例
      ```
      docker search cmake
      ```
      
   
   2. 选择合适的镜像（镜像需要集成了cmake且版本不低于3.9.5）
      ```
      NAME                  DESCRIPTION                            STARS     OFFICIAL   AUTOMATED
      lycantropos/cmake    CMake Docker image                       3                    [OK]
      ```
      
   
   3. 拉取镜像
      ![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/note_3.0-zh-cn.png)
      lycantropos/cmake镜像是docker hub第三方提供的镜像，非IoT团队发布，且IoT团队未提供任何官方镜像。该镜像在此仅做示例，IoT团队对该镜像的安全性不作保证。强烈建议用户自己封装镜像！
      ```
      docker pull lycantropos/cmake
      ```
      
   
   4. 添加启动脚本start.sh，放到项目文件下（和main.c在一个目录下）。
      ```
      function log(){
          echo `date "+%Y-%m-%d %T"`: $1
      }
      log "[INFO] start execute process."
      # 这里的路径取决于项目保存的位置
      cd /opt/iot/edge/MyCApp
      ./MyCApp
      ```
      ![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/note_3.0-zh-cn.png)
      MyCApp为可执行文件，生成步骤可参考[生成可执行文件](https://support.huaweicloud.com/devg-iotedge/iotedge_devg_0060.html)
      
   
   5. 编写 Dockerfile 制作镜像 创建 Dockerfile，命名为 myapp-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)
      下面提供myapp-dockerfile 样例，请根据具体需要修改。
      注意myapp-dockerfile需要和项目放到一个目录下。
      ```
      #Version 1.0.0
      # 基础镜像来源
      # 如果不采用在镜像中编译源文件的方式，可以任意选择基础镜像
      FROM lycantropos/cmake
      # 创建镜像文件目录，并且授权
      RUN mkdir -p /opt/iot/edge/MyCApp/conf && chmod -R 777 /opt
      ENV docker_path=/opt/iot/edge/MyCApp
      ENV LD_LIBRARY_PATH=${docker_path}:$LD_LIBRARY_PATH
      WORKDIR ${docker_path}
      # 复制工程或文件到指定目录
      COPY MyCApp/MyCApp $docker_path
      # 将依赖库和配置文件放到对应目录下，确保编译的时候不会出错
      COPY MyCApp/lib /usr/lib
      COPY MyCApp/conf $docker_path/conf
      COPY MyCApp/start.sh $docker_path
      # 指定容器将要监听的端口
      USER root
      EXPOSE 8082
      ENTRYPOINT ["/bin/bash", "/opt/iot/edge/MyCApp/start.sh"]
      ```
      
   
   6. 构建镜像
      ```
      docker build -f ./myapp-dockerfile -t my_app_docker:v1.0.0 ./
      ```
      
   
   7. 查看打包完成的镜像
      ```
      docker images
      ```
      可以看到**my_app_docker** 这个镜像已经制作完成。
      ```
      REPOSITORY       TAG         IMAGE ID       CREATED         SIZE
      my_app_docker   v1.0.0     983b4e5aa72a   10 minutes ago   1.51GB
      ```
      
   
   
   
   
4. 镜像上传 
   ![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/notice_3.0-zh-cn.png)
   以上步骤可以通过[体验馆](https://console.huaweicloud.com/swr/#/app/experience/list)熟悉流程。
   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将用于登录。
      
   
   3. 登录 SWR 仓库
      ```
      docker login -u [区域项目名]@[AK] -p [登录密钥] [镜像仓库地址]
      ```
      可以直接从[控制台](https://console.huaweicloud.com/swr/#/app/dashboard)获取登录命令，如下图。
      ![](https://support.huaweicloud.com/devg-iotedge/figure/zh-cn_image_0000001182427571.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 my_app_docker:v1.0.0 swr.cn-north-4.myhuaweicloud.com/iotedge/my_app_docker:v1.0.0
      ```
      
   
   5. 上传镜像
      ```
      docker push [镜像仓库地址/所属组织/镜像名:版本号]
      ```
      例如，
      ```
      docker push swr.cn-north-4.myhuaweicloud.com/iotedge/my_app_docker:v1.0.0
      ```
      
   
   6. 在[我的镜像](https://console.huaweicloud.com/swr/#/app/warehouse/list)查看上传结果
      ![](https://support.huaweicloud.com/devg-iotedge/figure/zh-cn_image_0000001136028274.png "点击放大")
      
   
   7. 上传镜像后请在 SWR 将镜像设置为公开。 步骤一：
      ![](https://support.huaweicloud.com/devg-iotedge/figure/zh-cn_image_0000001136188070.png "点击放大")
      步骤二：
      ![](https://support.huaweicloud.com/devg-iotedge/figure/zh-cn_image_0000001182307659.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_0000001182427573.png "点击放大")
      
    
   
   
 
 #### 插件包打包
1. 插件包制作。 
   1. 插件包格式要求如下： 插件包仅支持.tar.gz 、.tar或者 .zip格式。
      插件包结构如下：
      monitor-app.zip
      ├── MyCApp // 可执行文件
      └── stop.sh //停止脚本 非必须
      │ ├─lib
      │ │ ├─libmodule.so //sdk库文件
      │ │ └─\*\*\*
      │ ├─conf
      │ │ ├─sdk_log.conf //sdk日志配置
      │ │ ├─module.dat //sdk需要的密钥
      │ │ ├─rootcert.pem //证书
      └────start.sh //启动脚本 必须文件 当前不提供参数方式启动
      ![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/note_3.0-zh-cn.png)
      MyCApp为可执行文件，生成步骤可参考[生成可执行文件](https://support.huaweicloud.com/devg-iotedge/iotedge_devg_0060.html)
      ![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/caution_3.0-zh-cn.png)
      打包的文件至少需要包括lib和conf两个目录（目录下所有文件），加启动脚本start.sh和可执行文件 MyCApp 。
      
   
   2. 添加启动脚本 在可执行文件MyCApp的同一目录下创建启动脚本start.sh，内容如下
      ```
      log(){
          echo `date "+%Y-%m-%d %T"`: $1
      }
      log "[INFO] start execute process."
      # 指定添加链接库
      export LD_LIBRARY_PATH=$PWD/lib/:$LD_LIBRARY_PATH
      # 修改执行权限
      chmod 755 MyCApp
      ./MyCApp > myapp_running.log 2>&1
      ```
      ![](https://support.huaweicloud.com/devg-iotedge/public_sys-resources/note_3.0-zh-cn.png)
      通过[安装包部署](https://support.huaweicloud.com/devg-iotedge/iotedge_devg_0064.html#ZH-CN_TOPIC_0000001119964874__section10448175119142)的文件会放在/var/IoTEdge/downloaded-job/run下面，包括生成的日志文件myapp_running.log。
      
   
   3. 构建插件包。 压缩文件得到monitor-app.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-\>访问权限控制-\>桶策略中设置。
      
   
   
   
   
 
