c# - docker中的c#控制台应用程序-检查stdin是否可用
问题描述
全部,
我们在 docker 中运行 ac# dotnet core 3.0 控制台应用程序(不是 ASP.NET),我们使用键盘来执行控制台命令。在 Docker 中,我们的应用程序在尝试读取控制台键盘(stdin)时失败,因为 docker 已经重定向了输入流,我们可以使用 Console.isStdinRedirected 进行测试。
但是,当我们将终端远程附加到 docker 容器中的应用程序时,我们希望重新启用控制台键盘输入,但这也是一种重定向,因此 isStdinRedirected 对我们没有帮助。
有没有一种方法可以测试标准输入是否处于活动状态,以便我们可以重新启用我们的键盘?我只能想到在常规循环(带睡眠)中读取键盘时使用 try / catch,但这是一个丑陋的解决方案。
或者,有没有一种方法可以让 docker 向 dotnet 发出一个终端现在已连接的信号?
解决方案
我尝试了一个带有控制台输入的简单 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
推荐阅读
- python - 在 python 中使用 OS.Walk() 计算子文件夹
- javascript - JS 在表单允许提交之前输入正确的短语
- node.js - 使用 Node.js 和 Express 的在线编译器
- scala - Gatling Scala 日期随机格式不正确
- c# - Visual Studio 中未抛出预期异常,Linq Select 语句意外过滤结果
- c# - 如何将 4 个参数从后面的代码传递给客户端
- java - 为什么这个赋值在 Java 泛型中是非法的?
- node.js - 为什么 AWS EBS 的日志流无法正常工作?
- html - SASS 基于侧边栏改变 flex 布局
- geode - 对于使用集群配置为 true 的 apache geode 3 服务器集群,复制区域仅出现在 1 台服务器上,而不是全部 3