Как завершить docker контейнер с основным приложением do tnet - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть приложение do tnet Core 3.1 со следующим хостом, созданным в Program.cs

     public static async Task Main(string[] args)
    {
        var configuration = ConfigurationFactory.CreateConfiguration();
        var appName = configuration.GetAppName();
        Log.Logger = configuration.CreateSerilogLogger();
        try
        {
            Log.Information("Configuring console host ({ApplicationContext})...", appName);

            var host = Host.CreateDefaultBuilder(args)
                .UseConsoleLifetime(opts => opts.SuppressStatusMessages = true)
                .ConfigureServices((hostContext, services) =>
                {
                    services
                    .AddHostedService<EventRehydratorService>()
                }).Build();


            Log.Information("Starting console host ({ApplicationContext})...", appName);
            await host.StartAsync();
            await host.StopAsync();

        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Program terminated unexpectedly ({ApplicationContext})!", appName);
            Environment.Exit(-1);
        }
        finally
        {
            Log.CloseAndFlush();  
        }
        Environment.Exit(1);
    }

EventRehydratorService реализует IHostedService

 internal class EventRehydratorService : IHostedService
{
    private readonly IHostApplicationLifetime appLifetime;
    private readonly IConfiguration configuration;

    public IEventSourceService EventSourceService { get; }
    public IDocumentStore Store { get; }

    public EventRehydratorService(
        IHostApplicationLifetime appLifetime,
        IEventSourceService eventSourceService,
        IDocumentStore store,
        IConfiguration configuration)
    {
        this.appLifetime = appLifetime;
        EventSourceService = eventSourceService;
        Store = store;
        this.configuration = configuration;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        appLifetime.ApplicationStopping.Register(OnStopping);
        appLifetime.ApplicationStopped.Register(OnStopped);        

        return Task.CompletedTask;
    }

    private void OnStopping()
    {
        Log.Information("OnStopping has been called.");
    }

    private void OnStopped()
    {
        Log.Information("OnStopped has been called.");
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        appLifetime.StopApplication();
        return Task.CompletedTask;

    }
}

}

Docker file:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["Shophattan.EventRehydrator/EventRehydrator.csproj", "Shophattan.EventRehydrator/"]
COPY ["Common/Shophattan.Common/Shophattan.Common.csproj", "Common/Shophattan.Common/"]
COPY ["RavenDB.DependencyInjection/RavenDB.DependencyInjection.csproj", "RavenDB.DependencyInjection/"]
RUN dotnet restore "Shophattan.EventRehydrator/EventRehydrator.csproj"
COPY . .
WORKDIR "/src/Shophattan.EventRehydrator"
RUN dotnet build "EventRehydrator.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "EventRehydrator.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "EventRehydrator.dll"]

Все события вызываются, но контейнер продолжает работать. Это проблема с Kubernetes CronJob, потому что работа никогда не завершается. Я пытался убить текущий процесс, выдать исключение Environment.Exit () в методе OnStopped, но docker никогда не завершается. Не уверен, что я делаю не так?

1 Ответ

1 голос
/ 04 апреля 2020

разобрался - это просто как выход с нуля. По какой-то причине я подумал, что это должно быть положительное число.

Environment.Exit(0); 

Теперь задание успешно завершено:

NAME                             COMPLETIONS   DURATION   AGE
dev-eventrehydrator-1586018400   1/1           3s         15m
...