全部产品
云市场

使用 Docker 镜像构建 App

更新时间:2019-08-22 10:01:07

批量计算提供了 App 功能,可以使用虚拟机(VM)镜像来定制运行环境,也可以使用 Docker 镜像,本文将介绍如何使用 Docker 镜像创建 App 和提交 App 作业。

背景

如果您的作业使用了 ISV 提供的软件或算法,可以考虑将其封装在 Docker 镜像中,再使用 App 设置作业的模板(包括资源类型和运行环境),这样一来,提交作业时只需提供输入和输出信息即可。当软件或算法有更新时,只需要更新 Docker 镜像,比如通过 Docker 镜像的 Tag 来标识不同的版本号,修改 App 中 Docker 镜像的版本号即可完成运行环境的更新。

1. 准备 App 的 Docker 镜像

A) 制作 Docker 镜像

根据自己的需求,用户可以使用官方镜像仓库中的镜像作为基础镜像,安装需要的软件或算法,制作成 Docker 镜像,完成运行环境的定制;制作镜像有两种方法:

  • 使用 Dockfile 制作镜像
  • 使用容器快速制作镜像

具体制作方法可参考用户指南中的 Docker 镜像制作

建议:在制作 Docker 镜像时,最好带上 Tag,后续版本有更新时,只需要更新 Tag 即可。

B) 本地调试Docker镜像

Docker 镜像制作完成以后,可以参考用户指南中的 Docker 本地调试相关章节进行本地调试,确保 Docker 镜像在 BatchCompute 的环境下可以正常使用。

C) 推送到镜像仓库

可以将制作好的 Docker 镜像推送到 OSS 的镜像仓库。具体方法请参考用户指南中 Docker镜像上传到 OSS 的详细描述 。

2. 创建 App

BatchCompute提供了 API、SDK、控制台等三种方式创建 App,下面以控制台和 Python SDK 为例,分别介绍如何使用 Docker 镜像创建 App。

A) 使用控制台创建 App

假如 Docker 镜像被推送到 OSS 镜像仓库的路径为oss://demo-bucket/dockers/,镜像名称为localhost:5000/demodockerimage:0.1

create_app_basic

如上图所示,在创建 App 时,选择镜像类型为 Docker,填写 Docker 镜像的名称,以及 OSS Registry 的路径。关于控制台如何创建 App 的其他参数详情,请参考用户指南中创建 App 的描述,这里不再赘述。

B) 使用 SDK 创建 App

使用 Python SDK 创建 App 时,参考如下的形式:

  1. #encoding=utf-8
  2. import sys
  3. from batchcompute import Client, ClientError
  4. from batchcompute import CN_BEIJING as REGION
  5. from batchcompute.resources import (
  6. JobDescription, TaskDescription, DAG, AutoCluster, GroupDescription, ClusterDescription, AppDescription
  7. )
  8. ACCESS_KEY_ID='xxxx' # 填写您的 ACCESS_KEY_ID
  9. ACCESS_KEY_SECRET='xxxx' # 填写您的 ACCESS_KEY_SECRET
  10. def main():
  11. try:
  12. client = Client(REGION, ACCESS_KEY_ID, ACCESS_KEY_SECRET)
  13. app_desc = {
  14. "Name":"Docker-app-demo",
  15. "Daemonize":False,
  16. "Docker":{
  17. "Image":"localhost:5000/demodockerimage:0.1",
  18. "RegistryOSSPath":"oss://demo-bucket/dockers/"
  19. },
  20. "CommandLine":"python test.py",
  21. #其他参数这里不详细展示
  22. }
  23. appName = client.create_app(app_desc).Name
  24. print('App created: %s' % appName)
  25. except ClientError, e:
  26. print (e.get_status_code(), e.get_code(), e.get_requestid(), e.get_msg())
  27. if __name__ == '__main__':
  28. sys.exit(main())

如上面的实例代码所示,在AppDescription中填写 Docker 信息的ImageRegistryOSSPath。其他参数请参考用户指南中的创建示例

3. 提交 App 作业

提交作业时,不再涉及 Docker 相关的信息,具体方法请参考用户指南中提交 App 作业的描述。

4. Docker 镜像更新

假如 App 中使用的 ISV 提供的软件或算法有更新,您只需要更新 Docker 镜像,并用 Tag 标识版本。然后更新 App 信息中的 Docker 镜像名称就可以。

A) 使用控制台更新

modify_app_start

如上图所示,在 App 列表中找到需要更新的 App,点击修改按钮进入 App 的修改页面。

modify_app

如上图所示,在修改页面,修改 App 的 Docker 镜像名称后,点击提交即可完成 App 的更新。

B) 使用 SDK 更新

使用 Python SDK 来更新 App 的 Docker 信息可参考如下示例:

  1. #encoding=utf-8
  2. import sys
  3. from batchcompute import Client, ClientError
  4. from batchcompute import CN_BEIJING as REGION
  5. from batchcompute.resources import (
  6. JobDescription, TaskDescription, DAG, AutoCluster, GroupDescription, ClusterDescription, AppDescription
  7. )
  8. ACCESS_KEY_ID='xxxx' # 填写您的 ACCESS_KEY_ID
  9. ACCESS_KEY_SECRET='xxxx' # 填写您的 ACCESS_KEY_SECRET
  10. def main():
  11. try:
  12. client = Client(REGION, ACCESS_KEY_ID, ACCESS_KEY_SECRET)
  13. app_desc = {
  14. "Name":"Docker-app-demo",
  15. "Daemonize":False,
  16. "Docker":{
  17. "Image":"localhost:5000/demodockerimage:0.2",
  18. "RegistryOSSPath":"oss://demo-bucket/dockers/"
  19. },
  20. "CommandLine":"python test.py",
  21. "EnvVars": {}
  22. }
  23. res = client.modify_app("Docker-app-demo", app_desc)
  24. print res
  25. except ClientError, e:
  26. print (e.get_status_code(), e.get_code(), e.get_requestid(), e.get_msg())
  27. if __name__ == '__main__':
  28. sys.exit(main())

对于简单的修改 Docker 版本号的情况,推荐使用控制台,操作更简单。