
# 使用自定义镜像增强作业运行环境
#### 自定义镜像应用场景
通过下载DLI提供的基础镜像再按需制作自定义镜像，将作业运行需要的依赖（文件、jar包或者软件）、私有能力等内置到自定义镜像中，以此改变Spark作业和Flink作业的容器运行环境，增强作业的功能、性能。
例如，在自定义镜像中加入机器学习相关的Python包或者C库，可以通过这种方式帮助用户实现功能扩展。
![](https://support.huaweicloud.com/usermanual-dli/public_sys-resources/note_3.0-zh-cn.png)
用户使用自定义镜像功能需要具备[Docker](https://www.docker.com/)相关的基础知识。
#### 使用限制
- 创建自定义镜像必须使用DLI提供的基础镜像。
- 不能随意修改基础镜像中DLI相关组件及目录。
- 仅支持Spark jar作业、Flink jar作业，即jar包作业。
 
#### 使用流程
图1自定义镜像使用流程   
![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000001940346350.png "点击放大")
1. 获取DLI基础镜像。
2. 使用Dockerfile将作业运行需要的依赖（文件、jar包或者软件）打包到镜像中，生成自定义镜像。
3. 将镜像发布到SWR（容器镜像服务）中。
4. 在DLI服务作业编辑页面选择自己生成的镜像，运行作业。
5. 查看作业执行情况。
 
 #### 获取DLI基础镜像
请根据队列的架构类型选择相同类型的基础镜像。
查看队列的CPU架构类型请参考[查看队列的基本信息](https://support.huaweicloud.com/usermanual-dli/dli_01_0663.html)。
表1获取DLI基础镜像 
| 镜像类型       | 架构  | URL                                                                                                                   |
|:---|:---|:---|
| general镜像  | X86 | swr.cn-north-4.myhuaweicloud.com/dli-public/spark_general-x86_64:3.3.1-2.3.8.1120250109929356803819072.202501141605   |
| general镜像  | ARM | swr.cn-north-4.myhuaweicloud.com/dli-public/spark_general-aarch64:3.3.1-2.3.8.1120250109929356803819072.202501141605  |
| notebook镜像 | X86 | swr.cn-north-4.myhuaweicloud.com/dli-public/spark_notebook-x86_64:3.3.1-2.3.8.1120250109929356803819072.202501141605  |
| notebook镜像 | ARM | swr.cn-north-4.myhuaweicloud.com/dli-public/spark_notebook-aarch64:3.3.1-2.3.8.1120250109929356803819072.202501141605 |
   
#### 创建自定义镜像
以tensorflow为例，说明如何将tensorflow打包进镜像，生成安装了tensorflow的自定义镜像，在DLI作业中使用该镜像运行作业。
1. 准备容器环境。
   
   请参考[安装容器引擎](https://support.huaweicloud.com/qs-swr/index.html)文档中的"安装容器引擎"章节。
   
   
2. 使用root用户登录[1]容器镜像环境，执行以下命令获取DLI的基础镜像。
   
   本示例使用Spark基础镜像为例，使用**docker pull** 方式下载基础镜像到[1]中的容器镜像环境。
   **docker pull** *基础镜像下载地址*
   基础镜像下载地址参考[获取DLI基础镜像]。
   
   
3. 连接容器镜像服务。 
   1. 登录SWR管理控制台。
   
   2. 选择左侧导航栏的"总览"，单击页面右上角的"登录指令"，在弹出的页面中单击![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000001336444477.png)复制登录指令。
   
   3. 在安装容器引擎的虚拟机中执行上一步复制的登录指令。
   
   
   
   
4. 创建容器镜像组织。如果已创建组织则本步骤可以忽略。 
   1. 登录SWR管理控制台。
   
   2. 选择左侧导航栏的"组织管理"，单击页面右上角的"创建组织"。
   
   3. 填写组织名称，单击"确定"。
   
   
   
   
5. 编写Dockerfile文件。 
   **vi Dockerfile**
   具体内容参考如下，将tensorflow打包进镜像：
   ```
   ARG BASE_IMG=swr.xxx/dli-public/spark_general-x86_64:3.3.1-2.3.8.1120250109929356803819072.202501141605//请替换基础镜像的URL
   FROM ${BASE_IMG} as builder
   USER omm //注意要使用omm用户执行。
   RUN set -ex && \
       mkdir -p /home/omm/.pip && \
       pip3 install tensorflow==2.4.0
   内容复制到基础镜像中
   USER omm
   ```
   其中，主要包含了以下步骤：
   1. 设置pip的可用仓库地址。
   
   2. 使用pip3安装tensorflow算法包。
   
   3. 将安装了算法包的临时镜像builder里的内容复制到基础镜像中（这一步主要是为了减小镜像体积），用于生成最终的自定义镜像。
   
   
   
   
6. 利用Dockerfile生成自定义镜像。
   
   镜像打包命令格式：
   ```
   docker build -t [自定义组织名称]/[自定义镜像名称]:[自定义镜像版本] --build-arg BASE_IMG=[DLI基础镜像地址] -f Dockerfile .
   ```
   DLI基础镜像地址为[获取DLI基础镜像]中的镜像地址。
   示例：
   ```
   docker build -t mydli/spark:2.4 --build-arg BASE_IMG=swr.xxx/dli-public/spark_general-x86_64:3.3.1-2.3.8.1120250109929356803819072.202501141605 -f Dockerfile .
   ```
   
   
7. 给自定义镜像打标签。
   
   **docker tag** *[6]中的\[自定义组织名称\]/\[自定义镜像名称\]:\[自定义镜像版本\]* \[镜像仓库地址\]/\[组织名称\]/\[自定义镜像名称:自定义版本名称\]
   示例：
   ```
   docker tag mydli/spark:2.4 swr.xxx/testdli0617/spark:2.4.5.tensorflow
   ```
   
   
8. 上传自定义镜像。 
   **docker push** \[镜像仓库地址\]/\[组织名称\]/\[自定义镜像名称:自定义版本名称\]
   上述命令中的"\[镜像仓库地址\]/\[组织名称\]/\[自定义镜像名称:自定义版本名称\]"保持和[7]一致。
   示例：
   ```
   docker push swr.xxx/testdli0617/spark:2.4.5.tensorflow
   ```
   
   
9. 在DLI服务中提交Spark或者Flink jar作业时选择自定义镜像。 
   - 打开管理控制台的Spark作业或者Flink作业编辑页面，在自定义镜像列表中选择已上传并共享的镜像，运行作业，即可使用自定义镜像运行作业。
     如果选择的镜像不是共享镜像，自定义镜像处会提示该镜像未授权，则需要授权后才可以使用。具体可以参考[图3]，提示处单击"立即授权"即可，填写其他作业执行参数后，再执行作业。
     图2在DLI Spark作业编辑页面，选择自定义镜像   
     ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0294842971.png "点击放大")
     图3Spark作业镜像授权操作   
     ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000001219954177.png "点击放大")
     图4在DLI Flink jar作业编辑页面，选择自定义镜像   
     ![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000001255344113.png "点击放大") 
   
   - 在使用API时，在作业参数中指定image参数，即可使用自定义镜像运行作业。Spark作业请参考《[创建批处理作业](https://support.huaweicloud.com/api-dli/dli_02_0124.html)》，Flink jar作业请参考《[创建Flink Jar作业](https://support.huaweicloud.com/api-dli/dli_02_0230.html)》。
   
   
   
   
 
