У меня есть контейнер с .Net Host и фоновой службой, работающей в нем. Он отлично работает на моем Mac. При развертывании в Службе приложений Azure в Linux оно запускается, а затем немедленно завершается. Мне кажется, что Служба приложений Azure в Linux ожидает, что контейнер будет отвечать на запросы HTTP, но мой контейнер является фоновой службой, а не веб-сервером, и не предоставляет никаких портов. Как обеспечить бесперебойную работу моего закрепленного на докере хоста .Net с BackgroundService в Службе приложений Azure для Linux?
Должен ли я преобразовать его в веб-хост только для того, чтобы он отвечал на пинги? Должен ли я использовать какой-либо другой тип инфраструктуры Azure (контейнерные приложения?) Могу ли я отключить HTTP-пинги? (На портале нет очевидного способа сделать это) Есть еще мысли?
Логи выглядят так.
2024-04-26T19:45:41.663Z INFO - Starting container for site
2024-04-26T19:45:41.663Z INFO - docker run -d -p 4665:8080 --name redactedappname1302_0_61646b2f -e WEBSITE_USE_DIAGNOSTIC_SERVER=false -e WEBSITES_PORT=8080 -e WEBSITE_SITE_NAME=redactedappname1302 -e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=redactedappname1302.azurewebsites.net -e WEBSITE_INSTANCE_ID=2c847a802c8040b33d7df73fac3a50614d8069754a88be4922fa1677ca17ce3d -e HTTP_LOGGING_ENABLED=1 redactedregistryname.azurecr.io/redactedappname:20240426.20.2cf015ff -p 80:8080
2024-04-26T19:45:44.387Z INFO - Initiating warmup request to container redactedappname1302_0_61646b2f for site redactedappname1302
2024-04-26T19:45:49.146Z ERROR - Container redactedappname1302_0_61646b2f for site redactedappname1302 has exited, failing site start
2024-04-26T19:45:49.159Z ERROR - Container redactedappname1302_0_61646b2f didn't respond to HTTP pings on port: 8080, failing site start. See container logs for debugging.
2024-04-26T19:45:49.233Z INFO - Stopping site redactedappname1302 because it failed during startup.
Код (отредактированный по соображениям IP/работодателя и C!) выглядит так..
var builder = Host.CreateDefaultBuilder();
builder.ConfigureAppConfiguration((context, configBuilder) =>
{
//redacted, configuring logging, all working locally
});
builder.ConfigureServices((context, services) =>
{
services.
//Add various services, redacted, all working locally
//most importantly, add MyBackgroundService
.AddHostedService<MyBackgroundService>();
});
Log.Information("Starting ...");
var app = builder.Build();
try
{
await app.RunAsync();
}
catch (Exception ex)
{
Console.WriteLine(ex);
Log.Error(ex, "Failure");
}
Что находится внутри фоновой службы?
Тогда очевидно, что вместо этого вам следует использовать другой эго-хост службы Azure, например AKS.
Попробуйте добавить команду Startupcommand в службу приложений Azure как dotnet YourLocalProjectName.dll. Проверьте это Изображение
Должен ли я преобразовать его в веб-хост только для того, чтобы он отвечал на пинги? Должен ли я использовать какой-либо другой тип инфраструктуры Azure (контейнерные приложения?) Могу ли я отключить HTTP-пинги? (На портале нет очевидного способа сделать это) Есть еще мысли?
Преобразуйте свое приложение в веб-хостинг, чтобы отвечать на запросы ping. Я создал простое приложение и работающую в нем фоновую службу.
Это моя программа.cs:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddHostedService<MyBackgroundService>();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI(options =>
{ options.SwaggerEndpoint("/swagger/v1/swagger.json", "Web API V1");
if (app.Environment.IsDevelopment())
options.RoutePrefix = "swagger";
else
options.RoutePrefix = string.Empty;
}
);
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
BackgroundService.cs:
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;
public class MyBackgroundService : BackgroundService
{
private readonly ILogger<MyBackgroundService> _logger;
public MyBackgroundService(ILogger<MyBackgroundService> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Background service is running.");
Console.WriteLine("Background service is running.");
await Task.Delay(5000, stoppingToken);
}
}
}
ЛокальныйВывод:
Развернули приложение через реестр контейнеров Azure:
Добавьте команду запуска, указав сведения о реестре контейнеров Azure.
Вот поток журнала:
Если возможно, можете ли вы поделиться своим кодом?