首页 > 解决方案 > docker中的c#控制台应用程序-检查stdin是否可用

问题描述

全部,

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

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

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

或者,有没有一种方法可以让 docker 向 dotnet 发出一个终端现在已连接的信号?

标签: c#docker.net-coreconsole

解决方案


我尝试了一个带有控制台输入的简单 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

推荐阅读