У меня есть приложение, написанное против .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, когда он работает внутри контейнера ??