Docker/Linuxに.NET Coreアプリケーションを生き残らせる唯一の方法は、ASP.NETを私のためにホスティングすることです。これは醜いハックです!
このようにすると、docker run -d
オプションを使用してDockerで実行されるため、STDINストリームを有効にするためにライブ接続する必要はありません。
私は.NETのコアコンソールアプリケーション(ないASP.NETアプリケーション)を作成し、私のプログラムのクラスは次のようになります。
public class Program
{
public static ManualResetEventSlim Done = new ManualResetEventSlim(false);
public static void Main(string[] args)
{
//This is unbelievably complex because .NET Core Console.ReadLine() does not block in a docker container...!
var host = new WebHostBuilder().UseStartup(typeof(Startup)).Build();
using (CancellationTokenSource cts = new CancellationTokenSource())
{
Action shutdown =() =>
{
if (!cts.IsCancellationRequested)
{
Console.WriteLine("Application is shutting down...");
cts.Cancel();
}
Done.Wait();
};
Console.CancelKeyPress += (sender, eventArgs) =>
{
shutdown();
// Don't terminate the process immediately, wait for the Main thread to exit gracefully.
eventArgs.Cancel = true;
};
host.Run(cts.Token);
Done.Set();
}
}
}
スタートアップクラス:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IServer, ConsoleAppRunner>();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
}
}
ConsoleAppRunnerクラス
public class ConsoleAppRunner : IServer
{
/// <summary>A collection of HTTP features of the server.</summary>
public IFeatureCollection Features { get; }
public ConsoleAppRunner(ILoggerFactory loggerFactory)
{
Features = new FeatureCollection();
}
/// <summary>Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.</summary>
public void Dispose()
{
}
/// <summary>Start the server with an application.</summary>
/// <param name="application">An instance of <see cref="T:Microsoft.AspNetCore.Hosting.Server.IHttpApplication`1" />.</param>
/// <typeparam name="TContext">The context associated with the application.</typeparam>
public void Start<TContext>(IHttpApplication<TContext> application)
{
//Actual program code starts here...
Console.WriteLine("Demo app running...");
Program.Done.Wait(); // <-- Keeps the program running - The Done property is a ManualResetEventSlim instance which gets set if someone terminates the program.
}
}
唯一の良い点は、アプリケーションでDIを使用することです。 ) - 私の使用例では、私はロギングを処理するためにILoggingFactoryを使用しています。
出典
2016-11-11 13:56:58
Jay
私は自分自身を学ぶためにしようとしている:私はあなたが対話モードでそれを実行すると、おそらく用語を追加したいと思います。 'docker run -it --name demo Demo' – hdz
バックグラウンドモード(-d)で実行した場合、' docker attach {container} 'を使ってそれに戻ることもできます。すでに出力されているので出力は表示されませんが、コンテナを終了するにはenterキーを押すことができます – hdz