Azure Ошибка службы приложения "FailedToLocateDevelopmentCertificateFile" с изображением Docker - PullRequest
0 голосов
/ 27 марта 2020

У меня есть docker изображение, содержащее. NET Core 3.1 Web API. Он запускает локально и модульные тесты на обоих Docker изображениях в конвейере devops. Он создается и развертывается без ошибок, однако, когда я пытаюсь его запустить, я получаю следующую ошибку. Я вижу, что он должен быть правильно развернут, так как 2-я строка в журнале ниже записывается в файл Program.cs (см. Ниже). Любые идеи о том, как устранить ошибку?

Пожалуйста, потерпите меня, я новичок в Azure и контейнерах. Если вам нужна дополнительная информация о развертывании, дайте мне знать, и я обновлю вопрос.

Заранее спасибо.

Журнал ошибок:

2020-03-27T13:43:38.706066600Z [40m[32minfo[39m[22m[49m: MyApplication.Service.Program[0]
2020-03-27T13:43:38.706103500Z       MyApplication Service is starting.
2020-03-27T13:43:40.528762987Z {"@t":"2020-03-27T13:43:40.4726007Z","@mt":"Failed to locate the development https certificate at '{certificatePath}'.","@l":"Debug","certificatePath":null,"EventId":{"Id":2,"Name":"FailedToLocateDevelopmentCertificateFile"},"SourceContext":"Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer"}
2020-03-27T13:43:40.761834453Z [41m[1m[37mcrit[39m[22m[49m: Microsoft.AspNetCore.Server.Kestrel[0]
2020-03-27T13:43:40.761897653Z       Unable to start Kestrel.
2020-03-27T13:43:40.761904153Z System.Net.Sockets.SocketException (13): Permission denied
2020-03-27T13:43:40.769929759Z    at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, String callerName)
2020-03-27T13:43:40.769948159Z    at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
2020-03-27T13:43:40.769953859Z    at System.Net.Sockets.Socket.Bind(EndPoint localEP)
2020-03-27T13:43:40.770376759Z    at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind()
2020-03-27T13:43:40.770387759Z    at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken)
2020-03-27T13:43:40.770393259Z    at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.<>c__DisplayClass21_0`1.<<StartAsync>g__OnBind|0>d.MoveNext()
2020-03-27T13:43:40.770398559Z --- End of stack trace from previous location where exception was thrown ---
2020-03-27T13:43:40.770403259Z    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context)
2020-03-27T13:43:40.770407659Z    at Microsoft.AspNetCore.Server.Kestrel.Core.ListenOptions.BindAsync(AddressBindContext context)
2020-03-27T13:43:40.770412059Z    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.AddressesStrategy.BindAsync(AddressBindContext context)
2020-03-27T13:43:40.770685859Z    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindAsync(IServerAddressesFeature addresses, KestrelServerOptions serverOptions, ILogger logger, Func`2 createBinding)
2020-03-27T13:43:40.770966160Z    at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken)
2020-03-27T13:43:40.933067575Z Unhandled exception. System.Net.Sockets.SocketException (13): Permission denied
2020-03-27T13:43:40.933104075Z    at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, String callerName)
2020-03-27T13:43:40.933110975Z    at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
2020-03-27T13:43:40.933115675Z    at System.Net.Sockets.Socket.Bind(EndPoint localEP)
2020-03-27T13:43:40.933120075Z    at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketConnectionListener.Bind()
2020-03-27T13:43:40.933131775Z    at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(EndPoint endpoint, CancellationToken cancellationToken)
2020-03-27T13:43:40.933136675Z    at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.<>c__DisplayClass21_0`1.<<StartAsync>g__OnBind|0>d.MoveNext()
2020-03-27T13:43:40.933141875Z --- End of stack trace from previous location where exception was thrown ---
2020-03-27T13:43:40.933146075Z    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindEndpointAsync(ListenOptions endpoint, AddressBindContext context)
2020-03-27T13:43:40.933150375Z    at Microsoft.AspNetCore.Server.Kestrel.Core.ListenOptions.BindAsync(AddressBindContext context)
2020-03-27T13:43:40.933154575Z    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.AddressesStrategy.BindAsync(AddressBindContext context)
2020-03-27T13:43:40.933158875Z    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.AddressBinder.BindAsync(IServerAddressesFeature addresses, KestrelServerOptions serverOptions, ILogger logger, Func`2 createBinding)
2020-03-27T13:43:40.933163275Z    at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken)
2020-03-27T13:43:40.933167575Z    at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
2020-03-27T13:43:40.933171875Z    at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken)
2020-03-27T13:43:40.933176075Z    at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
2020-03-27T13:43:40.933182675Z    at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
2020-03-27T13:43:40.933186975Z    at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host)
2020-03-27T13:43:40.959954394Z    at MyApplication.Service.Program.Main(String[] p_lstArgs) in /app/MyApplication.Service/Program.cs:line 18
2020-03-27T13:43:41.294359133Z /app/run.sh: line 2:     6 Aborted                 (core dumped) dotnet MyApplication.Service.dll

Program.cs

        public static void Main(string[] p_lstArgs)
        {
            var objHost = CreateHostBuilder(p_lstArgs).Build();
            var objLogger = objHost.Services.GetRequiredService<ILogger<Program>>();
            objLogger.LogInformation("MyApplication Service is starting.");

            objHost.Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] p_lstArgs) =>
            Host.CreateDefaultBuilder(p_lstArgs)
                .ConfigureWebHostDefaults(objWebBuilder =>
                {
                    objWebBuilder
                        .UseStartup<Startup>()
                        .ConfigureLogging((objHostingContext, objLoggingBuilder) =>
                        {
                            objLoggingBuilder.AddApplicationInsights();
                            objLoggingBuilder.AddSerilog(dispose: true);
                        })
                        .UseUrls("http://0.0.0.0:80");
                });

Startup.cs

        private const string HEAL_CHECK_NAME = "ReadinessLiveness";

        public Startup(IWebHostEnvironment p_objEnvironment)
        {
            var objBuilder = new ConfigurationBuilder()
                .SetBasePath(p_objEnvironment.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{p_objEnvironment.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();

            var objBuildConfig = objBuilder.Build();

            if (objBuildConfig["KEY_VAULT_URI"] is var strKeyVaultUri && !string.IsNullOrEmpty(strKeyVaultUri))
                objBuilder.AddAzureKeyVault(strKeyVaultUri);

            Configuration = objBuilder.Build();
        }

        public IConfigurationRoot Configuration { get; }

        public void ConfigureServices(IServiceCollection p_objServices)
        {
            p_objServices.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

            // Configure AppInsights
            p_objServices.AddApplicationInsightsKubernetesEnricher();
            p_objServices.AddApplicationInsightsTelemetry(Configuration);

            // Add health check
            p_objServices.AddHealthChecks().AddCheck(HEAL_CHECK_NAME, () => HealthCheckResult.Healthy("OK"));

            p_objServices.AddControllers();

            // Register the Swagger generator, defining one or more Swagger documents
            p_objServices.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "MyApplication Service API", Version = "v1" });
            });
        }

        public void Configure(
            IApplicationBuilder p_objApplicationBuilder,
            IWebHostEnvironment p_objWebHostEnvironment,
            ILoggerFactory p_objLoggerFactory,
            IHttpContextAccessor p_objHttpContextAccessor)
        {
            Log.Logger = new LoggerConfiguration()
              .WriteTo.Console(new CompactJsonFormatter())
              .ReadFrom.Configuration(Configuration)
              .CreateLogger();

            // Important: it has to be first: enable global logger
            p_objApplicationBuilder.UseGlobalLoggerHandler();

            // Important: it has to be second: Enable global exception, error handling
            p_objApplicationBuilder.UseGlobalExceptionHandler();

            // TODO: Add middleware AuthZ here

            p_objApplicationBuilder.UseRouting();
            p_objApplicationBuilder.UseEndpoints(objEndpoints =>
            {
                objEndpoints.MapHealthChecks("/healthz");
                objEndpoints.MapControllers();
            });

            // Enable middleware to serve generated Swagger as a JSON endpoint.
            p_objApplicationBuilder.UseSwagger();

            // Enable middleware to serve swagger-ui (HTML, JS, CSS etc.), specifying the Swagger JSON endpoint.
            p_objApplicationBuilder.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyApplication Service API V1");
            });
        }

DockerFile

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 as base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build

WORKDIR /app
COPY NuGet.Config ./NuGet.Config
COPY MyApplication.Core/*.csproj ./MyApplication.Core/
COPY MyApplication.Service/*.csproj ./MyApplication.Service/
WORKDIR /app
RUN dotnet restore /app/MyApplication.Core/
RUN dotnet restore /app/MyApplication.Service/

WORKDIR /app
COPY MyApplication.Core/. ./MyApplication.Core/
COPY MyApplication.Service/. ./MyApplication.Service/

FROM build AS testrunner

WORKDIR /app/tests
COPY NuGet.Config ./NuGet.Config
COPY MyApplication.Service.Tests/*.csproj .
WORKDIR /app/tests
RUN dotnet restore /app/tests/

WORKDIR /app/tests
RUN mkdir -p TestResults/Coverage
COPY MyApplication.Service.Tests/. .
ENTRYPOINT ["dotnet", "test", "--logger:trx"]

FROM build AS publish


WORKDIR /app
RUN dotnet publish /app/MyApplication.Service/ -c release -o ./out --no-restore

FROM base AS runtime

LABEL Tags="Azure,AKS,Processor"

ARG user=apiuser

RUN useradd -m -s /bin/bash -U $user

WORKDIR /app
COPY --from=publish /app/out ./
COPY scripts/. ./
RUN \
    # Ensures the entry point is executable
    chmod ugo+x /app/run.sh

RUN chown -R $user.$user /app

# Set it for subsequent commands
USER $user

ENTRYPOINT ["/bin/bash", "/app/run.sh"]
...