【问题标题】:c# console app in docker - check if stdin is availabledocker中的c#控制台应用程序-检查stdin是否可用
【发布时间】:2019-11-15 07:36:12
【问题描述】:

全部,

我们有一个在 docker 中运行的 c# dotnet core 3.0 控制台应用程序(不是 ASP.NET),我们使用键盘来执行控制台命令。在 Docker 中,我们的应用程序在尝试读取控制台键盘(stdin)时失败,因为 docker 重定向了输入流,我们可以使用 Console.isStdinRedirected 进行测试。

但是,当我们将终端远程附加到 docker 容器中的应用程序时,我们希望重新启用控制台键盘输入,但这也是一种重定向,因此 isStdinRedirected 对我们没有帮助。

有没有一种方法可以测试标准输入是否处于活动状态,以便我们可以重新启用我们的键盘?我只能想到在常规循环中(带睡眠)读取键盘时使用 try / catch,但这是一个丑陋的解决方案。

或者,有没有办法让 docker 可以向 dotnet 发出信号表明终端现在已连接?

【问题讨论】:

    标签: c# docker .net-core console


    【解决方案1】:

    我尝试了一个简单的带有控制台输入的 hello world 应用程序,它工作正常。

    程序.cs

    using System;
    
    namespace consoleapp
    {
        class Program
        {
            static void Main(string[] args)
            {
                System.Console.WriteLine("Enter your name: ");
                var name = Console.ReadLine();
                Console.WriteLine($"Hello {name}");
            }
        }
    }
    

    Dockerfile:

    FROM mcr.microsoft.com/dotnet/core/sdk AS base
    WORKDIR /app
    
    COPY *.csproj .
    RUN dotnet restore
    
    COPY . .
    RUN dotnet publish -c Release -o out
    
    WORKDIR /app/out
    CMD dotnet consoleapp.dll
    

    使用 -i(交互式)和 -t(TTY)开关运行给了我以下输出

    $ docker run -it consoleapp
    Enter your name: 
    Zia
    Hello Zia
    

    【讨论】:

    • 谢谢 Ziaullah,我会在我回到我的开发机器时检查一下并告诉你结果。
    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    相关资源
    最近更新 更多