使用重启策略运行容器化任务

在 Azure 容器实例中部署容器的简便性和速度,使该服务成了可用于执行一次性任务(例如,在容器实例中生成、测试渲染作业并制作其映像)的引人注目的平台。

使用可配置的重启策略,可将容器指定为在完成其进程后停止。 由于 Azure 按秒对容器实例计费,因此只需为在执行任务的容器运行时使用的计算资源付费。

本文演示的示例使用 Azure CLI。 必须在本地安装 Azure CLI 2.0.21 或更高版本。

容器重启策略

在 Azure 容器实例中创建容器组时,可以指定三个重启策略设置中的一个。

重启策略 说明
Always 始终重启容器组中的容器。 如果在创建容器时未指定重启策略,则会应用此默认策略。
Never 当容器进程成功退出(退出代码 0)时,容器组中的容器永远不会重启。 如果容器使用非零退出代码退出,则平台可能仍会重启容器。 有关详细信息,请参阅 使用非零退出代码的重启行为
OnFailure 仅当容器中执行的进程失败(它以非零退出代码终止)时,才重启容器组中的容器。 容器至少运行一次。

注意

如果容器组配置了 IP 地址,则在重启容器组时,该 IP 地址可能会更改。

指定重启策略

重启策略的指定方式取决于容器实例的创建方式,例如,是使用 Azure CLI、Azure PowerShell cmdlet 还是 Azure 门户。 在 Azure CLI 中,在调用 --restart-policy 时指定 参数。

az container create \
    --resource-group myResourceGroup \
    --name mycontainer \
    --image mycontainerimage \
    --restart-policy OnFailure

一直运行到完成的示例

要查看重启策略的工作方式,请基于 Microsoft aci-wordcount 映像创建一个容器实例,并指定 OnFailure 重启策略。 此示例容器运行一个 Python 脚本,默认情况下,该脚本会分析莎士比亚著作哈姆雷特中的文本,将 10 个最常见的单词写入 STDOUT,然后退出。

使用以下 az container create 命令运行示例容器:

az container create \
    --resource-group myResourceGroup \
    --name mycontainer \
    --image mcr.microsoft.com/azuredocs/aci-wordcount:latest \
    --restart-policy OnFailure

Azure 容器实例将启动该容器,然后在其应用程序(在本例中为脚本)退出时停止。 当 Azure 容器实例停止重启策略为 NeverOnFailure 的某个容器时,该容器的状态将设置为 Terminated。 可以使用 az container show 命令检查容器的状态:

az container show \
    --resource-group myResourceGroup \
    --name mycontainer \
    --query containers[0].instanceView.currentState.state

示例输出:

"Terminated"

当示例容器的状态显示为 Terminated 后,可以通过查看容器日志来查看该容器的任务输出。 运行 az container logs 命令可查看脚本的输出:

az container logs --resource-group myResourceGroup --name mycontainer

输出:

[('the', 990),
 ('and', 702),
 ('of', 628),
 ('to', 610),
 ('I', 544),
 ('you', 495),
 ('a', 453),
 ('my', 441),
 ('in', 399),
 ('HAMLET', 386)]

此示例显示了由脚本发送到 STDOUT 的输出。 但是,容器化任务可能会将其输出写入到持久性存储供以后检索。 例如,写入到 Azure 文件共享

非零退出代码时的重启行为

当容器使用非零退出代码退出时,它表示错误或失败。 在此方案中,无论重启策略设置如何,平台仍可能重启容器。 即使重启策略设置为 Never,此行为也适用。

Never 重启策略仅保证容器在成功退出且退出代码为 0 时不会重启(即正常关闭)。 如果容器使用非零退出代码退出,平台可能会重启容器以尝试恢复。

如果需要确保容器仅运行一次而不考虑退出代码,请考虑以下方法:

  • 设计容器应用程序,使其能够在内部处理错误,并以 0 退出代码退出。
  • 使用 az container show 命令监视容器的退出代码,并根据结果采取适当的操作。

后续步骤

基于任务的方案(例如,使用多个容器批量处理大型数据集)可以在运行时利用自定义的环境变量命令行

有关如何保存一直运行到完成的容器的输出,请参阅装载包含 Azure 容器实例的 Azure 文件共享