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

  • 根据输入参数和发布到Azure函数的文件,使用C#代码从Azure函数启动Docker容器(Azure容器实例)。
  • 启动容器后,必须启动容器内的软件才能根据输入文件和发布到Azure函数的参数进行一些工作。
  • 完成Docker容器内的软件并将输出写入某个数据库(Azure中也为MS SQL Server)之后,Azure函数必须停止容器(也可以是轮询的其他Azure函数,例如每分钟一次) ,以检查任何Docker镜像是否未完成任何工作)。
  • 如果当前正在启动并运行Docker容器时,有一些请求传入Azure函数,则这些函数将从相同的镜像向上旋转一个新的Docker容器,并执行相同的操作。

  • 之所以需要启动和停止Docker容器,是为了降低成本,因为工作量很大,需要一个使用多个CPU内核和大量RAM的实例。

    最佳答案

    在“函数”中,可以使用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中启动和停止容器,而不是使用功能。你可能会想
    与此类似的工作流程:
  • 添加一个操作,该操作将触发Logic App,就像队列中的新消息一样。
  • 使用连接器创建ACI容器组。
  • 使用连接器在ACI中启动一个容器。
  • 您观察容器状态以查看其是否成功创建。
  • 您可以通过使用ACI连接器设置环境变量来将值传递到容器,例如文件名或作业号。
  • 您将添加一个循环,以监视容器中代码的完成情况(您在日志中发送的输出)
  • 使用连接器
  • 删除ACI

    您当然可以并行运行多个Logic App。

    关于c# - 根据输入从Azure功能启动和停止Docker容器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60016663/

    10-13 07:42
    查看更多