【问题标题】:Start and stop Docker container from Azure function based on input根据输入从 Azure 函数启动和停止 Docker 容器
【发布时间】:2020-02-01 12:02:27
【问题描述】:

我想知道是否有某种方法可以在 Azure 云平台上实现以下目标:

  1. 根据输入参数和发布到 Azure 函数的文件,使用 C# 代码从 Azure 函数启动 Docker 容器(Azure 容器实例)。

  2. 容器启动后,必须启动容器内的软件,根据发布到 Azure 函数的输入文件和参数执行一些工作。

  3. Docker 容器内的软件完成后,并将输出写入某个数据库(Azure 中也有 MS SQL Server),Azure 函数必须停止容器(也可以是轮询的不同 Azure 函数,例如每分钟一次,检查是否有任何 Docker 映像没有执行任何工作)。

  4. 如果在 Docker 容器当前启动并运行时有请求进入 Azure 函数,则函数会从同一映像启动新的 Docker 容器并执行相同的操作。

需要启动和停止 Docker 容器的原因是为了降低成本,因为需要使用多个 CPU 内核和大量 RAM 的实例的苛刻工作负载。

【问题讨论】:

  • 如果你在 Azure Kubernetes Service 上运行它,那么这实际上是在启动一个 Kubernetes Job。不过,我不知道 Kubernetes 集群相对于您的核心应用程序会有多少开销。

标签: c# azure docker azure-functions azure-container-instances


【解决方案1】:

在您的函数中,您可以使用 C# 中的 Microsoft.Azure.Management.ContainerInstance 命名空间在 ACI 中启动和停止容器。这是link to the Nuget package 和我找到的示例:

var containerGroup = azure.ContainerGroups.Define(containerGroupName)
    .WithRegion(azureRegion)
    .WithExistingResourceGroup(resourceGroupName)
    .WithLinux()
    .WithPublicImageRegistryOnly()
    .WithoutVolume()
    .DefineContainerInstance(containerGroupName)
         .WithImage(containerImage)
         .WithExternalTcpPort(80)
         .WithCpuCoreCount(1.0)
         .WithMemorySizeInGB(1)
         .Attach()
    .WithDnsPrefix(containerGroupName)
    .Create();

有很多方法可以实现您的目标。您可以使用 Logic App 使用 ACI connector 在 ACI 中启动和停止容器,而不是使用 Functions。你可以认为 类似这样的工作流程:

  • 添加将触发逻辑应用的操作,就像队列中的新消息一样。
  • 使用连接器创建 ACI 容器组。
  • 使用连接器在 ACI 中启动容器。
  • 你观察容器状态看是否创建成功。
  • 您可以通过使用 ACI 连接器设置环境变量(例如文件名或作业编号)来将值传递给容器。
  • 您添加一个循环来监视容器中代码的完成(您在日志中发送的输出)
  • 您使用连接器删除 ACI

您当然可以并行运行多个逻辑应用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多