教程:按定义的计划运行 ACR 任务

本教程介绍如何按计划运行 ACR 任务。 通过设置一个或多个计时器触发器来计划任务。 计时器触发器可以单独使用,也可以与其他任务触发器结合使用。

本教程介绍如何计划任务及完成以下任务:

  • 创建具有计时器触发器的任务
  • 管理计时器触发器

任务计划适用于如下所述的方案:

  • 运行容器工作负荷来执行计划性维护操作。 例如,运行容器化应用以从注册表中删除不需要的映像。
  • 在工作日针对要在现场监视的生产映像运行一组测试。

先决条件

  • 如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI

    • 如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展

    • 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade

关于计划任务

  • 使用 cron 表达式的触发器 - 任务的计时器触发器使用 cron 表达式。 该表达式是包含五个字段的字符串,这些字段指定要触发任务的分钟、小时、日期、月份和星期。 支持的最高频率为每分钟一次。

    例如,表达式 "0 12 * * Mon-Fri" 在每个工作日的中午(UTC 时间)触发任务。 请参阅本文稍后所述的详细信息

  • 多个计时器触发器 - 允许将多个计时器添加到g wh 任务,前提是计划不同。

    • 可在创建任务时指定多个计时器触发器,也可以在以后添加。
    • (可选)为触发器命名以便于管理,否则 ACR 任务将提供默认的触发器名称。
    • 如果多个计时器计划在某个时间发生重叠,ACR 任务将在每个计时器的计划时间触发任务。
  • 其他任务触发器 - 在计时器触发的任务中,还可以基于源代码提交基础映像更新启用触发器。 与其他 ACR 任务一样,也可以手动运行计划任务。

创建具有计时器触发器的任务

任务命令

首先,使用适用于环境的值填充以下 shell 环境变量。 此步骤并非必须执行的步骤,但它能让在此教程中执行多个 Azure CLI 命令更容易。 如果未填充环境变量,则每当示例命令中出现一个值,都必须手动替换该值。

ACR_NAME=<registry-name>        # The name of your Azure container registry

使用 az acr task create 命令创建任务时,可以选择性地添加计时器触发器。 添加 --schedule 参数并为计时器传递 cron 表达式。

举个简单的例子,以下任务会触发每天 21:00(UTC 时间)从 Azure 容器注册表运行 hello-world 映像的操作。 该任务无需源代码上下文即可运行。

az acr task create \
  --name timertask \
  --registry $ACR_NAME \
  --cmd mcr.microsoft.com/hello-world \
  --schedule "0 21 * * *" \
  --context /dev/null

运行 az acr task show 命令查看该计时器触发器是否已配置。 默认情况下,还启用了基础映像更新触发器。

az acr task show --name timertask --registry $ACR_NAME --output table
NAME      PLATFORM    STATUS    SOURCE REPOSITORY       TRIGGERS
--------  ----------  --------  -------------------     -----------------
timertask linux       Enabled                           BASE_IMAGE, TIMER

此外,还有一个简单的示例,即使用源代码上下文运行的任务。 以下任务会触发每天 21:00(UTC 时间)从 Azure 容器注册表运行 hello-world 映像的操作。

按照先决条件生成源代码上下文,然后使用上下文创建计划任务。

az acr task create \
  --name timertask \
  --registry $ACR_NAME \
  --context https://github.com/$GIT_USER/acr-build-helloworld-node.git#master \
  --file Dockerfile \
  --image timertask:{{.Run.ID}} \
  --git-access-token $GIT_PAT \
  --schedule "0 21 * * *"

运行 az acr task show 命令查看该计时器触发器是否已配置。 默认情况下,还启用了基础映像更新触发器。

az acr task show --name timertask --registry $ACR_NAME --output table

运行 az acr task run 命令以手动触发任务。

az acr task run --name timertask --registry $ACR_NAME

触发任务

使用 az acr task run 手动触发任务,以确保正确设置该任务:

az acr task run --name timertask --registry $ACR_NAME

如果容器成功运行,输出将如下所示。 该输出经过简化,只显示关键步骤

Queued a run with ID: cf2a
Waiting for an agent...
2020/11/20 21:03:36 Using acb_vol_2ca23c46-a9ac-4224-b0c6-9fde44eb42d2 as the home volume
2020/11/20 21:03:36 Creating Docker network: acb_default_network, driver: 'bridge'
[...]
2020/11/20 21:03:38 Launching container with name: acb_step_0

Hello from Docker!
This message shows that your installation appears to be working correctly.
[...]

在计划的时间之后,运行 az acr task list-runs 命令验证计时器是否按预期触发了任务:

az acr task list-runs --name timertask --registry $ACR_NAME --output table

如果计时器成功,输出将如下所示:

RUN ID    TASK     PLATFORM    STATUS     TRIGGER    STARTED               DURATION
--------  -------- ----------  ---------  ---------  --------------------  ----------
ca15      timertask  linux       Succeeded  Timer      2020-11-20T21:00:23Z  00:00:06
ca14      timertask  linux       Succeeded  Manual     2020-11-20T20:53:35Z  00:00:06

管理计时器触发器

使用 az acr task timer 命令管理 ACR 任务的计时器触发器。

添加或更新计时器触发器

创建任务后,可以选择性地使用 az acr task timer add 命令添加计时器触发器。 以下示例将名为 timer2 的计时器触发器添加到前面创建的 timertask。 此计时器每日 10:30(UTC 时间)触发任务。

az acr task timer add \
  --name timertask \
  --registry $ACR_NAME \
  --timer-name timer2 \
  --schedule "30 10 * * *"

使用 az acr task timer update 命令更新现有触发器的计划或更改其状态。 例如,更新名为 timer2 的触发器,以在 11:30(UTC 时间)触发任务:

az acr task timer update \
  --name timertask \
  --registry $ACR_NAME \
  --timer-name timer2 \
  --schedule "30 11 * * *"

列出计时器触发器

az acr task timer list 命令可显示针对任务设置的计时器触发器:

az acr task timer list --name timertask --registry $ACR_NAME

示例输出:

[
  {
    "name": "timer2",
    "schedule": "30 11 * * *",
    "status": "Enabled"
  },
  {
    "name": "t1",
    "schedule": "0 21 * * *",
    "status": "Enabled"
  }
]

删除计时器触发器

使用 az acr task timer remove 命令从任务中删除计时器触发器。 以下示例从 timertask 中删除 timer2 触发器:

az acr task timer remove \
  --name timertask \
  --registry $ACR_NAME \
  --timer-name timer2

Cron 表达式

ACR 任务使用 NCronTab 库来解释 cron 表达式。 ACR 任务支持的表达式包含空格分隔的五个必需字段:

{minute} {hour} {day} {month} {day-of-week}

cron 表达式使用的时区为协调世界时 (UTC)。 时间为 24 小时制。

注意

ACR 任务不支持在 cron 表达式中使用 {second}{year} 字段。 如果复制其他系统中使用的 cron 表达式,请确保删除这些字段(如果已使用)。

每个字段可以具有下列类型之一的值:

类型 示例 何时触发
一个具体值 "5 * * * *" 每小时的第 5 分钟
所有值 (*) "* 5 * * *" 从 5:00 UTC 开始每隔一分钟(每天 60 次)
一个范围(- 运算符) "0 1-3 * * *" 每天 1:00、2:00 和 3:00 UTC,触发 3 次
一组值(, 运算符) "20,30,40 * * * *" 每小时的第 20 分钟、30 分钟和 40 分钟,触发 3 次
一个间隔值(/ 运算符) "*/10 * * * *" 每小时的第 10 分钟、20 分钟...,触发 6 次

若要指定月份或天,可以使用数字值、名称或名称的缩写:

  • 对于天,数字值为 0 到 6,其中 0 表示星期日。
  • 名称采用英语。 例如:MondayJanuary
  • 名称不区分大小写。
  • 名称可缩写。 建议对缩写使用三个字母。 例如:MonJan

Cron 示例

示例 何时触发
"*/5 * * * *" 每五分钟一次
"0 * * * *" 每小时一次(在每小时的开头)
"0 */2 * * *" 每两小时一次
"0 9-17 * * *" 从 9:00 到 17:00 UTC 每小时触发一次
"30 9 * * *" 每天 9:30 UTC
"30 9 * * 1-5" 每个工作日的 9:30 UTC
"30 9 * Jan Mon" 一月份的每个星期一 9:30 UTC

清理资源

若要删除本系列教程中创建的所有资源(包括容器注册表、容器实例、密钥保管库和服务主体),请发出以下命令:

az group delete --resource-group $RES_GROUP
az ad sp delete --id http://$ACR_NAME-pull

后续步骤

本教程介绍了如何创建由计时器自动触发的 Azure 容器注册表任务。

有关使用计划任务清理注册表中的存储库的示例,请参阅从 Azure 容器注册表中自动清除映像

有关由源代码提交或基础映像更新触发的任务的示例,请参阅 ACR 任务系列教程中的其他文章。