排查 Azure 容器注册表中的连续修补问题

本文中的故障排除提示可帮助你解决在 Azure 容器注册表中使用连续修补时可能会遇到的常见问题。 将引入两个新命令来帮助调试。

列出正在运行的任务

若要列出最近执行的连续修补任务,可以使用以下 List 命令:

az acr supply-chain workflow list -r <registryname> -g <resourcegroup> [--run-status <failed || successful || running>] -t continuouspatchv1

成功的结果将返回以下信息:

  • 映像名称和标记
  • 工作流类型
  • 扫描状态
  • 上次扫描日期和时间(如果状态失败,日期将留空)
  • 扫描任务 ID (用于进一步调试)
  • 补丁状态
  • 上次修补日期和时间(如果状态失败,日期将留空)
  • 修补的图像名称 + 标记
  • 补丁任务 ID(用于进一步调试)

示例:

ubuntu:jammy-20240111
scan status: successful
scan date: 2024-07-02T14:02:00
scan task ID: abc
patch status: successful
patch date: 2024-07-02T14:04:00
patch task id: def
patched image: ubuntu:jammy-20240111-1
workflow type: continuouspatchv1

[--run-status] 将返回与指定筛选器匹配的所有任务状态。 此 CLI 命令提供重要的调试信息。

例如,如果在运行状态中指定了“失败”值,则只会列出未能完成修补的镜像。

有关可能输出的完整列表,请参阅附录。

取消正在运行的任务

某些方案可能需要取消当前正在运行或等待运行的任务。 为此,请运行以下 CLI 命令:

az acr supply-chain workflow cancel-run -r <registryname> -g <resourcegroup> --type <continuouspatchv1>

此命令将取消当前计划中状态为“正在运行”、“已排队”或“已启动”的所有正在进行的补丁任务。 例如,如果取消每日计划 (--schedule 1d) 上的任务,则这些状态中的任务将在当天取消,但第二天将重新排队。 如果计划是每周,则下周再次显示已取消的任务。

取消的典型原因是你希望立即修复的错误配置,而不是等待修补任务完成。 然后,该命令返回成功或失败状态。

疑难解答提示

查找失败的任务

使用任务列表命令输出所有失败的任务。 指定使用“cssc-patch”命令是应对失败的最佳选择。

前 10 个失败修补任务的任务列表命令

az acr task list-runs -r <registryname> -n cssc-patch-image --run-status Failed --top 10

此命令将输出所有失败的任务。 若要调查特定故障,请获取通过此命令输出的 runID,然后运行

az acr task logs -r <registryname> --run-id <run-id>

配置不当的工作流

使用 cancel 命令取消排队的任务。

az acr supply-chain workflow cancel-run -r <registryname> -g <resourcegroup> --type <continuouspatchv1>

在之后重新配置连续修补工作流。

附录

“List”命令的可能 CLI 输出

az acr supply-chain workflow list -r <registryname> -g <resourcegroup> [--run-status <Failed || Queued || Running || Skipped || Succeeded || Unknown>]

如果扫描和修补成功

image: import:dotnetapp-manual
        scan status: Succeeded
        scan date: 2024-09-13 21:05:58.841962+00:00
        scan task ID: dt21
        patch status: Succeeded
        patch date: 2024-09-13 21:07:32.841962+00:00
        patch task ID: xyz2
        last patched image: import:dotnetapp-manual-patched
        workflow type: continuouspatchv1

如果扫描成功,但修补程序未成功(以前的修补映像可用)

image: import:dotnetapp-manual
        scan status: Succeeded
        scan date: 2024-09-13 21:05:58.841962+00:00
        scan task ID: dt21
        patch status: Failed
        patch date: 2024-09-13 21:07:32.841962+00:00
        patch task ID: xyz2
        last patched image: import:dotnetapp-manual-patched
        workflow type: continuouspatchv1

如果扫描成功,但修补程序未成功(没有以前的修补映像可用)

image: import:dotnetapp-manual
        scan status: Succeeded
        scan date: 2024-09-13 21:05:58.841962+00:00
        scan task ID: dt21
        patch status: Failed
        patch date: 2024-09-13 21:07:32.841962+00:00
        patch task ID: xyz2
        last patched image: ---No patch image available---
        workflow type: continuouspatchv1

如果扫描成功且不需要修补(未找到 OS 漏洞)

image: import:dotnetapp-manual
        scan status: Succeeded
        scan date: 2024-09-13 21:05:58.841962+00:00
        scan task ID: dt21
        patch status: Skipped
        skipped patch reason: no vulnerability found in the image import:dotnetapp-manual image: 
        patch date: ---Not Available---
        patch task ID: ---Not Available---
        last patched image: import:dotnetapp-manual-patched
        workflow type: continuouspatchv1

如果扫描成功且不需要修补,并且尚不存在任何修补的映像

image: import:dotnetapp-manual
        scan status: Succeeded
        scan date: 2024-09-13 21:05:58.841962+00:00
        scan task ID: dt21
        patch status: Skipped
        skipped patch reason: no vulnerability found in the image import:dotnetapp-manual image: 
        patch date: ---Not Available---
        patch task ID: ---Not Available---
        last patched image: ---Not Available---
        workflow type: continuouspatchv1

如果扫描失败,并且存在已修补的映像

image: import:dotnetapp-manual
        scan status: Failed
        scan date: 2024-09-13 21:05:58.841962+00:00
        scan task ID: dt21
        patch status: ---Not Available---
        patch date: ---Not Available---
        patch task ID: ---Not Available---
        last patched image: import:dotnetapp-manual-patched
        workflow type: continuouspatchv1

如果扫描失败,并且不存在以前的修补映像

image: import:dotnetapp-manual
        scan status: Failed
        scan date: 2024-09-13 21:05:58.841962+00:00
        scan task ID: dt21
        patch status: ---Not Available---
        patch date: ---Not Available---
        patch task ID: ---Not Available---
        last patched image: ---Not Available---
        workflow type: continuouspatchv1

如果当前扫描正在运行中,并且存在已修补的镜像

image: import:dotnetapp-manual
        scan status: Running
        scan date: 2024-09-13 21:05:58.841962+00:00
        scan task ID: dt21
        patch status: ---Not Available---
        patch date: ---Not Available---
        patch task ID: ---Not Available---
        last patched image: import:dotnetapp-manual-patched
        workflow type: continuouspatchv1

如果扫描当前正在运行,并且不存在已修补的镜像

image: import:dotnetapp-manual
        scan status: Running
        scan date: 2024-09-13 21:05:58.841962+00:00
        scan task ID: dt21
        patch status: ---Not Available---
        patch date: ---Not Available---
        patch task ID: ---Not Available---
        last patched image: ---Not Available---
        workflow type: continuouspatchv1

如果修补程序当前正在运行,并且存在修补的映像

image: import:dotnetapp-manual
        scan status: Succeeded
        scan date: 2024-09-13 21:05:58.841962+00:00
        scan task ID: dt21
        patch status: Running
        patch date: 2024-09-13 21:07:32.841962+00:00
        patch task ID: xyz2
        last patched image: import:dotnetapp-manual-patched
        workflow type: continuouspatchv1

如果修补程序当前正在运行,并且不存在已修补的映像

image: import:dotnetapp-manual
        scan status: Succeeded
        scan date: 2024-09-13 21:05:58.841962+00:00
        scan task ID: dt21
        patch status: Running
        patch date: 2024-09-13 21:07:32.841962+00:00
        patch task ID: xyz2
        last patched image: ---Not Available---
        workflow type: continuouspatchv1