自定义镜像

更新时间:
复制为 MD 格式

当 DataWorks 的默认运行环境无法满足任务(如 PyODPS、Shell)的特定依赖需求时,例如需要安装额外的 Python 库 (pandas,jieba),可以创建自定义镜像。通过将所有依赖预先打包并固化,自定义镜像提供一个可复用、标准化的任务执行环境,确保环境一致性并显著提升开发与部署效率。

适用范围

  • 版本限制

    • 所有版本均可创建和使用自定义镜像。

    • 仅专业版及以上版本支持镜像构建能力。

  • 资源组限制:镜像功能仅支持Serverless资源组

    旧版资源组请使用运维助手安装外部依赖。
  • 权限限制:拥有AliyunDataWorksFullAccessModifyResourceGroup权限策略。

    授权详情请参见产品及控制台权限控制详情:RAM Policy

配额与限制

  • 镜像数量:不同DataWorks版本,支持创建的自定义镜像数量上限不同。

    • 基础版和标准版:10个。

    • 专业版:50个。

    • 企业版:100个。

  • 构建并发:每个地域最多支持 2 个镜像同时进行构建。

  • ACR 镜像要求

    • 实例版本:仅支持企业版的阿里云ACR实例。

    • 实例架构:仅支持AMD64架构。

    • 镜像大小:单个镜像大小不能超过5GB

    • 时区配置:需要安装时区相关的基础包tzdata,避免因与DataWorks设置的时区不一致导致容器异常退出。

  • 镜像构建:仅支持基于 DataWorks 官方镜像创建的自定义镜像。引用阿里云 ACR 镜像创建的自定义镜像不支持持久化构建,每次运行任务时均需重新拉取和部署。

  • 支持的节点类型与对应方式:

    节点类型

    直接基于官方镜像构建

    引用ACR镜像构建

    PyODPS2

    支持

    不支持

    PyODPS3

    支持

    不支持

    EMR Spark

    支持

    不支持

    EMR Spark SQL

    支持

    不支持

    EMR SHELL

    支持

    不支持

    Shell

    支持

    支持

    Python

    支持

    支持

    Notebook

    不支持

    支持

    CDH

    支持

    不支持

    赋值节点

    支持

    不支持

操作流程

一、创建自定义镜像

DataWorks创建自定义镜像时,支持以DataWorks官方镜像阿里云ACR镜像作为镜像引用类型来创建镜像,以下为选择不同引用类型时的不同配置参数:

基于DataWorks官方镜像直接创建

  1. 登录DataWorks控制台,单击左侧导航栏上的镜像管理进入镜像管理页面。

  2. DataWorks官方镜像页签下,选择目标镜像作为基础,单击操作栏的创建自定义镜像。在弹窗中系统将自动填充目标镜像相关信息,其他参数如下。

    引用类型:默认选中DataWorks官方镜像。镜像命名空间:默认选中DataWorks Default。镜像仓库:默认选中DataWorks Default。

    参数

    说明

    镜像名称/ID

    默认选中目标官方镜像,可按需切换。

    可见范围

    支持配置自定义镜像的可见范围,包括仅创建者可见全员可见

    使用子产品

    当前自定义镜像仅支持用于数据开发

    支持任务类型

    根据不同镜像类型,按需选择需要支持的节点任务类型。在数据开发中运行匹配的节点任务时,可配置该镜像为其运行的镜像。

    安装包

    按需添加第三方包,可同时选择多种模式并安装多个包。支持以下方式:

    • 快捷安装:在安装包下拉选择框选择Python2Python3Yum,可以直接选择需要安装的环境、资源。

      若下拉列表中没有需要的第三方包,切换至Script模式手动安装。
    • 手动输入:在安装包下拉选择框选择Script。可通过Script命令框手动输入安装命令。您可选择以下手动输入示例命令下载第三方包。

      • pip示例命令:pip install xx,支持Python2使用。

      • pip3示例命令:/home/tops/bin/pip3 install 'urllib3<2.0' ,支持Python3使用。

      • yum示例命令:yum install -y git

      • wget示例命令:wget git

        更多安装命令说明,请参见附录:安装命令参考
    重要

    若需安装或依赖位于公网的第三方包,则Serverless资源组绑定的VPC具备公网访问能力

  3. 单击确定,完成镜像创建。

基于阿里云ACR镜像创建

基于ACR镜像创建自定义镜像,需开通容器镜像服务。仅支持通过企业版AMD64架构的阿里云ACR镜像实例来创建DataWorks镜像。

  1. 登录DataWorks控制台,单击左侧导航栏上的镜像管理进入镜像管理页面。

  2. 自定义镜像页签下,单击创建镜像。在弹窗中配置关键参数:

    参数

    说明

    引用类型

    选择阿里云ACR镜像

    镜像实例ID

    选择在阿里云容器镜像服务中创建的企业版实例

    镜像命名空间

    选择该镜像实例下的命名空间

    镜像仓库

    选择该镜像实例下的镜像仓库

    镜像版本

    支持根据所选中的镜像仓库,选择镜像仓库下您需要创建自定义镜像的镜像版本。

    关联的vpc

    选择镜像实例绑定的VPC网络,配置VPC网络详情请参见:配置专有网络的访问控制

    重要

    DataWorks仅支持选择一个VPC访问阿里云ACR镜像实例。

    同步至MaxCompute

    默认为。该选项需同时满足以下两个前置条件后才可设置为,否则保持默认不可选

    • 所选镜像实例实例规格标准版高级版企业版

    • 当前阿里云账号已开通并购买MaxCompute计算资源。

    满足前置条件后,选择不同值的效果如下:

    • 选择:默认生成DataWorks自定义镜像,DataWorks镜像发布时同步构建为MaxCompute镜像。

      详情请参见个人开发环境制作MaxCompute镜像
    • 选择:仅生成DataWorks自定义镜像,不会同步构建为MaxCompute镜像。

    可见范围

    支持配置自定义镜像的可见范围,包括仅创建者可见全员可见

    使用子产品

    当前自定义镜像仅支持用于数据开发

    支持任务类型

    ACR镜像启动方式为启动命令+用户任务代码文件路径的方式启动,以下为不同任务类型和默认启动命令:

    • Shell

    • Python:若需将阿里云ACR镜像创建的自定义镜像应用于Python任务,需确认您的ACR镜像实例内是否包含Python环境,否则无法支持Python任务。

    • Notebook

      • 若需将阿里云ACR镜像创建的自定义镜像应用于Notebook任务,请将DataWorks提供的Notebook基础镜像作为您ACR镜像的基础镜像,为Notebook任务提供运行环境。DataWorks提供的Notebook基础镜像:dataworks-public-registry.cn-shanghai.cr.aliyuncs.com/public/dataworks-notebook:py3.11-ubuntu22.04-20241202

      • 请确保您构建镜像使用的环境已具备公网访问能力,以便正常获取DataWorks提供的Notebook基础镜像。

  3. 单击确定,完成镜像创建。

基于个人开发环境实例创建

Data Studio新版数据开发支持将个人开发环境制作成新的镜像,详情可参见:个人开发环境制作DataWorks镜像

二、测试与发布自定义镜像

DataWorks控制台的镜像管理 > 自定义镜像页签下,对目标镜像进行发布。只有测试成功的镜像才可以发布。如果测试失败,可在目标自定义镜像的操作列单击image > 修改,修改镜像配置。

具体操作步骤如下:

  1. 镜像管理 > 自定义镜像页签下,在目标镜像操作列单击发布,打开发布镜像对话框。

  2. 配置测试参数后单击测试,启动镜像测试。

    参数

    说明

    测试资源组

    选择用于测试的Serverless资源组

    测试CU

    为本次测试分配的计算资源量,默认0.5 CU,最小0.25 CU。如镜像较大或测试长时间不通过,可适当调高 CU 后重试。

  3. 查看测试结果测试日志

    • 测试启动后,测试结果显示为测试中,您可单击刷新刷新最新状态,或单击取消测试提前终止本轮测试,终止后可重新选择资源组与 CU 重测。

    • 测试日志区会实时输出镜像构建过程的命令行日志,提供以下操作能力:最大化(全屏查看长日志)、复制(一键复制日志全文到剪贴板)、下载(下载为 image-test-log-<镜像ID>.log)、折叠/展开

    • 测试失败时,测试结果显示为测试失败,并自动展示 AI 诊断面板。系统会基于测试日志、镜像层信息等给出失败原因与修复建议,您可参考诊断结论调整镜像配置或安装命令后单击再次测试重新测试。

    • 测试成功后,测试结果显示为测试成功。如需变更测试条件再次验证,可单击再次测试

  4. 在测试通过的前提下,单击对话框底部的发布提交发布。发布成功后,镜像可被 DataWorks 任务节点引用。

    说明

    仅在测试结果测试成功发布失败时,发布按钮可用;其余状态(如测试中测试失败已发布)下按钮置灰。

测试与发布时,需注意以下内容:

  • 测试自定义镜像时,资源组请选择Serverless资源组

  • 如果您基于阿里云ACR镜像创建基于个人开发环境制作镜像,则需确保测试与发布时选择的Serverless资源组绑定的VPC需与阿里云镜像容器内绑定的VPC一致

  • 如果您配置的自定义镜像是从公网获取第三方包,且长时间测试不通过,请检查测试资源组绑定的VPC是否具备公网访问能力

  • 若在镜像测试发布过程中出现构建失败(例如发布状态显示为已发布(构建失败)),控制台可能仅提示构建失败而不展示详细原因,自助排查难度较大。一种常见情形为构建环境磁盘空间不足:构建阶段所需磁盘空间可能略高于测试阶段,因此测试仍可能通过,而在发布或生成镜像产物时失败。建议您在测试与发布镜像时,适当调高计算 CU(例如在原有基础上增加0.5 CU)后重试。若调高后仍未成功,请提交工单联系阿里云技术支持协助排查。

三、绑定镜像归属空间

发布后的镜像,可通过修改镜像归属空间在不同工作空间中应用。

  1. DataWorks控制台的镜像管理 > 自定义镜像页签下,查看并找到已发布的自定义镜像。

  2. 在目标镜像操作列单击image > 修改归属工作空间,为自定义镜像绑定归属工作空间。

四、在任务中使用镜像

新版数据开发使用镜像

  1. 进入数据开发:进入DataWorks工作空间列表页,在顶部切换至目标地域,找到目标工作空间,单击操作列的快速进入 > DataStudio,进入Data Studio。

  2. 配置镜像:在数据开发功能中找到待测试自定义镜像的任务节点,单击右侧调度配置,配置资源属性。

    • 资源组:选择Serverless资源组

      如果此处未显示目标资源组,请检查是否将该资源组绑定至当前工作空间。您可以前往资源组列表页,找到目标资源组,然后单击操作列的绑定工作空间,完成绑定。
      重要

      为确保任务节点顺利运行,请确保资源组发布镜像时选择的测试资源组一致。

    • 镜像:选择已发布的自定义镜像

      若切换镜像,需将节点发布后,才能在生产环境中生效。

      调度配置 > 调度策略面板底部,配置资源组计算CU(例如 0.5),并在镜像下拉框中完成选择。

  3. 调试节点:在节点右侧运行配置中,配置计算资源资源组计算 CU镜像脚本参数,然后在节点顶部工具栏单击运行

  4. 发布节点:在节点顶部工具栏单击发布,将节点发布至生产环境。

旧版数据开发使用镜像

  1. 进入数据开发:登录DataWorks控制台,切换至目标地域后,单击左侧导航栏的数据开发与运维 > 数据开发,在下拉框中选择对应工作空间后单击进入数据开发

  2. 配置镜像:在数据开发功能中找到待测试自定义镜像的任务节点,单击右侧调度配置,配置资源属性。

    • 调度资源组:选择Serverless资源组

      如果此处未显示目标资源组,请检查是否将该资源组绑定至当前工作空间。您可以前往资源组列表页,找到目标资源组,然后单击操作列的绑定工作空间,完成绑定。
      重要

      为确保任务节点顺利运行,请确保调度资源组发布镜像时选择的测试资源组一致。

    • 镜像:选择已发布的自定义镜像

      若切换镜像,需将节点发布后,才能在生产环境中生效。
  3. 调试节点:在节点顶部工具栏单击带参运行image),配置资源组名称运行CU镜像,然后单击运行

  4. 发布节点:在节点顶部工具栏单击保存提交,将节点发布至生产环境。

五、构建持久化镜像

重要

强烈建议在镜像发布并通过业务验证后进行镜像持久化。该做法可有效规避因镜像源依赖库被篡改或版本未明确指定,导致任务初始化时下载到非预期版本而引发运行失败的风险。

常规自定义镜像每次运行都会重新部署,会增加节点运行时间且可能承担更多的计算费用。DataWorks 的持久化镜像功能只需构建一次即可无限次复用,能够提升任务运行效率、降低计算与流量成本,同时确保环境的高度一致性。构建持久化镜像只支持通过官方镜像创建的自定义镜像。

  1. DataWorks控制台的镜像管理 > 自定义镜像页签下,查看并找到已发布的自定义镜像。

  2. 在目标镜像操作列单击image > 构建,将自定义镜像构建为持久化镜像。

  3. 在弹出的请选择构建镜像的资源组对话框中,配置以下参数后单击继续

    • 构建资源组:选择用于本次构建的Serverless资源组

    • 构建 CU:为本次构建分配的计算资源量,默认0.5 CU,最小0.25 CU,步长0.25。镜像体量较大或构建耗时较长时,可适当调高。

    重要

    为避免因网络等原因出现构建失败的情况,请确保构建镜像的资源组发布自定义镜像时选择的测试资源组一致。

  4. 构建镜像大约耗时5~10分钟,具体视镜像大小而定。成功构建之后,目标镜像的发布状态变成已发布(构建成功)

六、镜像列表的其他操作

镜像管理 > 自定义镜像页签下,针对单个镜像还提供以下日常运维能力:

操作

说明

禁用 / 启用

在镜像操作列单击禁用后,子产品将不再展示和引用该镜像;已基于该镜像运行的任务不受影响。禁用后操作列变为启用,可重新启用。镜像状态为已过期时,禁用不可用。

修改

在镜像操作列单击修改,可修改镜像描述、可见范围、支持的子产品与节点任务类型、安装包等配置。镜像处于发布中构建中状态时不允许修改。

版本查看

在镜像操作列单击版本查看,查看该镜像的所有历史版本,便于追溯和回滚。

删除镜像

在镜像操作列单击删除镜像

警告

删除后,不会影响运行中的任务,但删除的镜像无法恢复,新任务也无法继续引用,镜像管理页面也无法查看管理。

标签

在自定义镜像列表标签列可为镜像添加和管理标签,便于按业务线、环境等维度对镜像分组检索。官方镜像列表不展示该列。

计费说明

构建镜像会按照CU数量 × 构建时长收取计算费用,系统默认分配0.5CU。计费详情,请参见Serverless资源组计费标准

应用于生产

为确保在生产环境中稳定、高效、经济地使用自定义镜像,请参考以下建议。

  • 持久化镜像:建议对已发布且配置稳定的镜像进行镜像构建,形成持久化镜像。这样可避免任务每次运行时都重新安装依赖,从而缩短启动时间、降低计算成本并提高稳定性。

  • 环境一致性:确保用于测试、构建和生产调度的Serverless 资源组所绑定的VPC和网络配置一致,尤其是在访问私有 ACR 仓库或公网时。

  • 版本锁定:在通过 Script方式安装依赖时,强烈建议明确指定版本号(如 pip install pandas==1.5.3),避免上游库更新导致非预期的行为变更。

  • 回滚方案:如果更新镜像后生产任务失败,可通过任务发布历史回滚到上一个版本,或在调度配置中将镜像重新指向旧的、稳定的版本。

场景实践案例

本实践演示如何通过PyODPS节点使用镜像实现中文分词能力。假设需要对MaxCompute表中的某一列中文数据进行分词,然后将分词结果存入另一张表中,用于下游调度节点使用。您可在自定义镜像中预装jieba分词工具包,然后通过PyODPS任务使用该镜像对数据表中的中文数据进行分词处理,并将结果存储至新表,无缝集成至下游调度流程。

  1. 创建测试数据。

    1. 创建DataWorks工作空间绑定MaxCompute计算资源。详情请参见创建工作空间计算资源管理

    2. 在数据开发中,创建ODPS节点(旧版数据开发)或MaxCompute SQL节点(新版数据开发),新建测试表并添加测试数据。

      说明

      如下示例使用了调度参数,请在右侧调度配置中设置参数名为bday,参数值为$[yyyymmdd]

      创建测试表。

      -- 创建测试表
      CREATE TABLE IF NOT EXISTS custom_img_test_tb
      (
          c_customer_id BIGINT NOT NULL,
          c_customer_text STRING NOT NULL,
          PRIMARY KEY (c_customer_id)
      )
      COMMENT 'TABLE COMMENT'
      PARTITIONED BY (ds STRING COMMENT '分区')
      LIFECYCLE 90;
      -- 向表中插入测试数据
      INSERT INTO custom_img_test_tb PARTITION (ds='${bday}') (c_customer_id, c_customer_text) VALUES
      (1, '晚来天欲雪,能饮一杯无?'),
      (2, '月落乌啼霜满天,江枫渔火对愁眠。'),
      (3, '山重水复疑无路,柳暗花明又一村。'),
      (4, '春眠不觉晓,处处闻啼鸟。'),
      (5, '静夜思,床前明月光,疑是地上霜。'),
      (6, '海上生明月,天涯共此时。'),
      (7, '旧时王谢堂前燕,飞入寻常百姓家。'),
      (8, '一行白鹭上青天,窗含西岭千秋雪。'),
      (9, '人生得意须尽欢,莫使金樽空对月。'),
      (10, '天生我材必有用,千金散尽还复来。');
    3. 保存并发布。

  2. 创建自定义镜像。

    参见创建自定义镜像,关键参数如下:

    • 镜像名称/ID:选择dataworks_pyodps_task_pod,DataWorks PyODPS节点官方镜像。

    • 支持任务类型:支持PyODPS2PyODPS 3

    • 安装包:选择Python3jieba

  3. 发布自定义镜像并修改归属项目空间。具体请参见发布自定义镜像修改镜像归属空间

  4. 在调度任务中使用自定义镜像。

    1. 在数据开发中,创建PyODPS3节点,配置如下内容:

      使用自定义镜像。

      import jieba
      from odps import ODPS
      from odps.models import TableSchema as Schema, Column, Partition
      # 读取表数据
      table = o.get_table('custom_img_test_tb')
      partition_spec = f"ds={args['bday']}"
      with table.open_reader(partition=partition_spec) as reader:
          records = [record for record in reader]
      # 对提取的文本进行分词
      participles = [' | '.join(jieba.cut(record['c_customer_text'])) for record in records]
      # 创建目标表
      if not o.exist_table("participle_tb"):
          schema = Schema(columns=[Column(name='word_segment', type='string', comment='分词结果')], partitions=[Column(name='ds', type='string', comment='分区字段')])
          o.create_table("participle_tb", schema)
      # 写入分词结果到目标表
      # 定义输出分区和表
      output_partition = f"ds={args['bday']}"
      output_table = o.get_table("participle_tb")
      # 如果分区不存在,先创建分区
      if not output_table.exist_partition(output_partition):
          output_table.create_partition(output_partition)
      # 将分词结果写入表
      record = output_table.new_record()
      with output_table.open_writer(partition=output_partition, create_partition=True) as writer:
          for participle in participles:
              record['word_segment'] = participle
              writer.write(record)
    2. 在右侧调度配置中,设置如下关键参数:

      • 调度参数:参数名bday,参数值为$[yyyymmdd]

      • 调度资源组:选择Serverless资源组,与发布镜像时选择的测试资源组相同。

      • 镜像:选择已发布并绑定了当前工作空间的自定义镜像。

    3. 节点调试。

      • 如果使用旧版数据开发,请在节点顶部工具栏单击带参运行image),配置资源组名称运行CU镜像自定义参数,然后单击运行

      • 如果使用新版数据开发,请在节点右侧运行配置中,配置计算资源资源组计算 CU镜像脚本参数,然后在节点顶部工具栏单击运行

    4. (可选)新建临时查询(旧版数据开发)或在个人目录下创建SQL文件(新版数据开发),使用如下SQL查询产出表中是否有数据。

      -- 将<分区日期>替换成具体日期。
      SELECT * FROM participle_tb WHERE ds=<分区日期>;

      查询成功返回数据时,结果包含 word_segment(分词结果,各词以竖线 | 分隔)和 ds(分区日期)两列,表明产出表中已有数据。

    5. PyODPS节点发布至生产环境。

      说明

      数据开发中修改的镜像不会同步到生产环境中,您需要将任务发布后,才能在生产环境中生效。详情请参见发布任务(旧版数据开发)节点/工作流发布(新版数据开发)

  5. 将自定义镜像构建为持久化镜像。具体请参见构建持久化镜像

常见问题

Q:Python任务报错urllib3 v2.0 only supports OpenSSL 1.1.1+。

A:urllib3 v2.0仅支持OpenSSL1.1.1+,可降低urllib3版本以兼容OpenSSL。例如,安装三方包的时候强行指定urllib3的版本:/home/tops/bin/pip3 install urllib3==1.26.16

相关文档

附录:安装命令参考

如果使用自定义镜像的script方式配置安装命令,则可以参考如下命令安装:

  • 如果依赖PyODPS 2节点,请执行如下命令。

    pip install <需要安装的包> -i  https://pypi.tuna.tsinghua.edu.cn/simple
    pip install <需要安装的包>
    说明

    执行命令后,如果提示需要升级PIP版本,请执行命令pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple

  • 如果依赖PyODPS 3节点,请执行如下命令。

    /home/tops/bin/pip3 install <需要安装的包> -i https://pypi.tuna.tsinghua.edu.cn/simple
    /home/tops/bin/pip3 install <需要安装的包>
    说明
    • 执行命令后,如果提示需要升级PIP版本,请执行命令/home/tops/bin/pip3 install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple

    • 如果出现报错/home/admin/usertools/tools/cmd-0.sh:行3: /home/tops/bin/python3: 没有那个文件或目录,请提交工单申请开启权限。

    Python公开镜像源参考如下,可按需切换。

    机构/公司

    镜像地址

    阿里云 (Aliyun)

    https://mirrors.aliyun.com/pypi/simple/

    重要

    从阿里云获取Python包,无需开通公网访问能力。

    清华大学 (Tsinghua)

    https://pypi.tuna.tsinghua.edu.cn/simple

    中国科学技术大学 (USTC)

    https://pypi.mirrors.ustc.edu.cn/simple/