使用自定义镜像
使用自定义镜像的场景
用户可以依赖DLI提供的Spark或者Flink基础镜像,使用Dockerfile将作业运行需要的依赖(文件、jar包或者软件)打包到镜像中,生成自己的自定义镜像,然后将镜像发布到SWR(容器镜像服务)中,最后在DLI服务作业编辑页面选择自己生成的镜像,运行作业。用户可以将一些私有能力内置到自定义镜像中,从而增强作业的功能、性能。
用户使用自定义镜像功能需要具备Docker相关的基础知识。
使用自定义镜像的限制条件
- 只支持容器化队列。
- 只支持Spark、Flink jar作业,即jar包作业。
使用自定义镜像操作步骤
以tensorflow为例,说明如何将tensorflow打包进镜像,生成安装了tensorflow的自定义镜像,在DLI作业中使用该镜像运行作业。
- 准备容器环境。
请参考安装容器引擎文档中的“安装容器引擎”章节。
- 使用root用户登录1容器镜像环境,执行以下命令获取DLI的基础镜像。
本示例使用Spark基础镜像为例,使用wget方式下载基础镜像到1中的容器镜像环境。
wget 下载基础镜像章节中的镜像下载地址
示例,Spark 2.4.5基础镜像下载:wget https://uquery-image.obs.xxx.com:443/1.0.0/spark-2.4.5-1.0.0-x86_64.tar.gz
- 本地加载自定义镜像。
docker load < 步骤2中获取到的基础镜像包名
示例,加载Spark 2.4.5基础镜像:docker load < spark-2.4.5-1.0.0-x86_64.tar.gz
加载完成后,保存图1中“Loaded image:”后的基础镜像加载地址,后续步骤会使用该地址。 - 连接容器镜像服务。
- 登录SWR管理控制台。
- 选择左侧导航栏的“总览”,单击页面右上角的“登录指令”,在弹出的页面中单击复制登录指令。
- 在安装容器引擎的虚拟机中执行上一步复制的登录指令。
- 创建容器镜像组织。如果已创建组织则本步骤可以忽略。
- 登录SWR管理控制台。
- 选择左侧导航栏的“组织管理”,单击页面右上角的“创建组织”。
- 填写组织名称,单击“确定”。
- 为加载的基础镜像打标签。
docker tag 3获取的镜像加载地址 [镜像仓库地址]/[组织名称]/[镜像名称:版本名称]
示例:docker tag registry-cbu.huawei.com/dli-x86_64/spark:2.4.5-2.3.3 swr.xxx/testdli0617/spark:2.4.5.test
- 上传基础镜像到镜像仓库。
docker push [镜像仓库地址]/[组织名称]/[镜像名称:版本名称]
上述命令中的“[镜像仓库地址]/[组织名称]/[镜像名称:版本名称] ”保持和6一致。
示例:docker push swr.xxx/testdli0617/spark:2.4.5.test
- 编写Dockerfile文件。
vi Dockerfile
具体内容参考如下,将tensorflow打包进镜像:
ARG BASE_IMG=spark:latest FROM ${BASE_IMG} as builder USER root RUN set -ex && \ mkdir -p /root/.pip && \ //设置pip的可用仓库地址 echo "[global]" >> /root/.pip/pip.conf && \ //配置华为镜像源 echo "index-url = https://mirrors.huaweicloud.com/repository/pypi/simple" >> /root/.pip/pip.conf //配置华为镜像源 RUN pip3 install --user --no-cache-dir tensorflow==1.13.1 FROM ${BASE_IMG} USER root COPY --from=builder --chown=omm:ficommon /root/.local /home/omm/.local //将安装了算法包的临时镜像builder里的内容拷贝到基础镜像中 USER omm
其中,主要包含了以下步骤:
- 设置pip的可用仓库地址。
- 使用pip3安装tensorflow算法包。
- 将安装了算法包的临时镜像builder里的内容拷贝到基础镜像中(这一步主要是为了减小镜像体积),用于生成最终的自定义镜像。
- 利用Dockerfile生成自定义镜像。
镜像打包命令格式:
docker build -t [自定义组织名称]/[自定义镜像名称]:[自定义镜像版本] --build-arg BASE_IMG=[DLI基础镜像地址] -f Dockerfile .
DLI基础镜像地址为6中的“[镜像仓库地址]/[组织名称]/[镜像名称:版本名称]”。
示例:docker build -t mydli/spark:2.4 --build-arg BASE_IMG=swr.xxx/testdli0617/spark:2.4.5.test -f Dockerfile .
- 给自定义镜像打标签。
docker tag 9中的[自定义组织名称]/[自定义镜像名称]:[自定义镜像版本] [镜像仓库地址]/[组织名称]/[自定义镜像名称:自定义版本名称]
示例:docker tag mydli/spark:2.4 swr.xxx/testdli0617/spark:2.4.5.tensorflow
- 上传自定义镜像。
docker push [镜像仓库地址]/[组织名称]/[自定义镜像名称:自定义版本名称]
上述命令中的“[镜像仓库地址]/[组织名称]/[自定义镜像名称:自定义版本名称]”保持和10一致。
示例:docker push swr.xxx/testdli0617/spark:2.4.5.tensorflow
- 在DLI服务中提交Spark或者Flink jar作业时选择自定义镜像。
- 打开管理控制台的Spark作业或者Flink作业编辑页面,在自定义镜像列表中选择已上传并共享的镜像,运行作业,即可使用自定义镜像运行作业。
如果选择的镜像不是共享镜像,自定义镜像处会提示该镜像未授权,则需要授权后才可以使用。具体可以参考图3,提示处单击“立即授权”即可,填写其他作业执行参数后,再执行作业。图2 在DLI Spark作业编辑页面,选择自定义镜像
图4 在DLI Flink jar作业编辑页面,选择自定义镜像
- 在使用API时,在作业参数中指定image参数,即可使用自定义镜像运行作业。Spark作业请参考《创建批处理作业》,Flink jar作业请参考《创建Flink Jar作业》。
- 打开管理控制台的Spark作业或者Flink作业编辑页面,在自定义镜像列表中选择已上传并共享的镜像,运行作业,即可使用自定义镜像运行作业。