首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法让Linux容器在独立进程中作为Azure函数运行

无法让Linux容器在独立进程中作为Azure函数运行
EN

Stack Overflow用户
提问于 2022-05-17 11:11:35
回答 2查看 495关注 0票数 1

函数应用程序在本地运行,但作为Linux容器部署。部署的函数没有报告门户中的任何问题,我可以看到函数刀片中列出的三个函数。但是,没有一个正在工作(一个是简单的HTTP,它返回502个不好的网关响应)。

因此,门户中没有明显的问题,但是对日志的检查会发现这个反复出现的异常:

System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess的System.Threading.Tasks.TaskCanceledException

格式化的消息是:

未能为运行时启动新的语言工作人员:

我怀疑这与站点设置linuxFxVersion的价值有关。请注意,我试过使用DOTNET|6.0DOTNET-ISOLATED|6.0。在这两种情况下,这似乎都没有什么区别,而且无论如何,当我导出函数应用程序的ARM模板时,它将linuxFxVersion设置为以DOCKER|为前缀的容器映像的URI。

这似乎与这是微软的具体建议。有关将主机版本固定在Linux上有关。但是,我仍然不清楚我应该如何评价我们,而且无论如何,来自另一个Microsoft文档的建议说:

要在Linux上支持zip部署和从部署包中运行,您还需要将linuxFxVersion站点配置设置更新为DotNet-Indivision6.0。

不管怎么说,这是我配置的细节。我听从了微软的指导,希望有人能发现我错过了什么.

项目文件的前两部分:

代码语言:javascript
复制
<PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <AzureFunctionsVersion>V4</AzureFunctionsVersion>
    <OutputType>Exe</OutputType>
    <ImplicitUsings>true</ImplicitUsings>
    <Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.CosmosDB" Version="3.0.9" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.0.13" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.3.0" OutputItemType="Analyzer" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.5.2" />
</ItemGroup>

host.json:

代码语言:javascript
复制
{
    "version": "2.0",
    "logging": {
        "applicationInsights": {
            "samplingSettings": {
                "isEnabled": true,
                "excludedTypes": "Request"
            }
        }
    }
}

Main方法在Program.cs中:

代码语言:javascript
复制
public static async Task Main()
{
    var host = new HostBuilder()
        .ConfigureFunctionsWorkerDefaults()
        .ConfigureAppConfiguration((context, configurationBuilder) =>
        {
            configurationBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

            if (context.HostingEnvironment.IsDevelopment())
            {
                configurationBuilder.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true);
            }
            else
            {
                configurationBuilder.AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true);
            }

            configurationBuilder.AddEnvironmentVariables();
        })
        .ConfigureServices((context, collection) => ConfigureServices(collection, context.Configuration, context.HostingEnvironment))
        .Build()
        .RunAsync();
}

函数配置管道设置以下应用程序设置:

代码语言:javascript
复制
FUNCTIONS_EXTENSION_VERSION: '~4'
FUNCTIONS_WORKER_RUNTIME: 'dotnet-isolated'

如前所述,在供应期间定义的站点配置的最新版本包括:

代码语言:javascript
复制
linuxFxVersion: 'DOTNET-ISOLATED|6.0'

Docker映像使用mcr.microsoft.com/azure-functions/dotnet-isolated:4作为发布应用程序的基本映像,并使用mcr.microsoft.com/dotnet/sdk:6.0构建它。

请告诉我有明显的东西我错过了。我们目前有两个功能应用程序,两者都不能部署为dotnet-孤立的。快把我逼疯了!

EN

回答 2

Stack Overflow用户

发布于 2022-05-18 14:15:47

在和这个搏斗了两天之后,我决定直接脱光衣服。从零开始跟踪微软指南。这使我发现以下几行是问题所在:

代码语言:javascript
复制
configurationBuilder.AddEnvironmentVariables();

一旦我将这一行添加到我的Program中,并将一个新的图像推到函数应用程序中,一切都会在重启时中断。然而,没有迹象表明原因。Kudo公开的Docker日志将此报告为最后条目:

2022-05-18T14:06:46.295Zinfo-容器映像-站点函数名称-名称已成功初始化并已准备好为请求提供服务。

App跟踪显示,在Program.cs的第52行发生了异常,这是我的host.Run();行。

例外是:

Microsoft.Azure.WebJobs.Script.Workers.Rpc.RpcFunctionInvocationDispatcherLoadBalancer.GetLanguageWorkerChannel的System.InvalidOperationException

其中隐藏着一条信息:“没有找到任何初始化的语言工作者”,我理解是Azure函数语言,因为“在创业过程中发生了一些不好的事情,但我不会告诉你什么或为什么”。

因此,这至少解释了为什么我的函数没有运行,希望我的经验能在未来节省其他人的时间,但是由于我的应用程序依赖于通过管道添加到函数中的配置,所以我仍然没有一个可用的应用程序。为此,我将提出一个新的问题,并将其联系在这里.

更新

以下是后续问题,我已经回答了!

票数 1
EN

Stack Overflow用户

发布于 2022-05-18 15:38:31

您看到的异常不是直接来自您的应用程序,而是一个通用的异常,没有来自Azure函数运行时进程的detaills --所以它是无用的。

原因可以是什么,例如:忘记等待一项任务。

代码语言:javascript
复制
public static async Task Main()
{
   var host = new HostBuilder()
      .ConfigureFunctionsWorkerDefaults()
      .ConfigureAppConfiguration(builder =>
      {
         builder
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true)
            .Build();
      })
      .ConfigureServices((context, collection) => ConfigureServices(collection, context.Configuration, context.HostingEnvironment))
    .Build();

     host.RunAsync();  // await host.RunAsync();
}

或者是损坏的appsettings.json

代码语言:javascript
复制
{
   "Logging": {
      "LogLevel": {
         "Default": "Warning",
         "Microsoft": "Warning",
         "Host": "Warning",
         "Function": "Information",
         "Host.Aggregator": "Information"
      }

}

或者在启动过程中缺少配置调用。

代码语言:javascript
复制
public static async Task Main()
{
   var host = new HostBuilder()
      // .ConfigureFunctionsWorkerDefaults()
      .ConfigureAppConfiguration(builder =>
      {
         builder
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true)
            .Build();
      }))
      .ConfigureServices((context, collection) => ConfigureServices(collection, context.Configuration, context.HostingEnvironment))
    .Build();

     await host.RunAsync();
}

启动应用程序的Microsoft运行时进程捕获所有控制台日志,并在自己启动时发生异常时将其销毁。

顺便说一句,您还应该启用代码分析,这是默认情况下在.net 6中没有启用的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72273025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档