教程:按定义的计划运行 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 表示星期日。
- 名称采用英语。 例如:
Monday
、January
。 - 名称不区分大小写。
- 名称可缩写。 三字母是建议的缩写长度。 例如:
Mon
、Jan
。
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 任务系列教程中的其他文章。