Невозможно запустить Kestrel в контейнере Docker - PullRequest
0 голосов
/ 09 мая 2018

У меня есть приложение, написанное против .NETCore 2.0. Я могу без проблем запустить приложение на моем компьютере CentOS 7 в bash.

Я успешно создал файл Docker и создал образ Docker.

Когда я запускаю изображение как контейнер с docker run, я получаю следующее исключение:

2018-05-09 08:18:02.038 +00:00 [FTL] [Microsoft.AspNetCore.Server.Kestrel] [ThreadId 4] Unable to start Kestrel.
Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal.Networking.UvException: Error -99 EADDRNOTAVAIL address not available
   at Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal.Networking.LibuvFunctions.ThrowError(Int32 statusCode)
   at Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal.Networking.UvTcpHandle.Bind(IPEndPoint endPoint)
   at Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal.Listener.ListenTcp(Boolean useFileHandle)
   at Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal.Listener.<>c.<StartAsync>b__8_0(Listener listener)
   at Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal.LibuvThread.DoPostWork()

Не знаю, что означает Адрес недоступен означает! Этот адрес не используется в моей подсети и не настроен порт. В C # я использую следующий код для настройки Kestrel:

В моей главной ()

var wHost = BuildWebHost(args[1]);
wHost.Run();

Метод BuildWebHost() определяется как:

    private static IWebHost BuildWebHost(string hostAddress)
    {
        return new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseSerilog()
            .ConfigureAppConfiguration((builderContext, config) =>
            {
                config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
            })
            .UseDefaultServiceProvider((context, options) =>
            {
                options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
            })
            .UseStartup<Startup>()
            .UseUrls($"http://{hostAddress}:{ServerPort}")
            .Build();
    }

IP-адрес передается в качестве аргумента, а ServerPort является константой. В файле Docker у меня есть

ENTRYPOINT ["dotnet", "OperationsManagerServer.dll", "/logs", "172.16.63.250"]

Перед запуском Kestrel служба выполняет большую инициализацию, такую ​​как загрузка конфигураций из базы данных Redis и инициализация чего-либо на сервере MongoDB. Эти серверы работают на разных машинах в одной подсети, и это просто отлично работает. Поэтому я предполагаю, что сеть в моем контейнере работает.

Есть идеи, что не так с Kestrel, когда он работает внутри контейнера ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...