У меня есть 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"]