docker-compose不会将stdin附加到.net核心应用程序Console.ReadLine

时间:2018-10-20 20:25:19

标签: docker .net-core docker-compose

使用docker-compose时,我注意到了奇怪的行为。 Console.ReadLine()不等待用户输入。

观察以下简化的点网核心c#控制台应用程序:

private static void Main(string[] args)
{
    Console.WriteLine("Input something:");
    while (true)
    {
        var line = Console.ReadLine();
        Console.WriteLine($"{DateTime.Now} Input was: {line}");
        System.Threading.Thread.Sleep(1000);
    }
}

如果您通过docker run -i readline运行此程序,则效果很好

enter image description here

但是,如果您使用docker-compose up,它将循环播放而无需等待STDIN上的输入:

enter image description here

那是为什么?

您可以使用以下方法自己尝试:

git clone https://github.com/mh-qUjB/docker-dotnetcore-readline.git
cd ./docker-dotnetcore-readline/ReadLine
docker-compose up

我正在对此进行测试:

  • Ubuntu 16.04
  • Docker version 18.06.1-ce, build e68fc7a
  • docker-compose version 1.22.0, build f46880fe
  • <TargetFramework>netcoreapp2.1</TargetFramework>
  • Dockerfile参见here

谢谢。

PS:如果您可以改善这个问题的标题,我会很高兴的。

1 个答案:

答案 0 :(得分:2)

您可以找到单个容器并在该容器中执行命令。 Docker compose正在流式传输您的日志,因此,它不为您提供交互式外壳。

例如,假设您有此撰写文件,

function calculate(time) {
  // split string into words
  let times = time.split(/\s+/);
  
  let totalMinutes = 0;
  while (times.length > 0) {
    // get quantity from number in pair
    let quantity = Number(times.shift());
    // get unit of measurement from pair
    let unit = times.shift();
    let multipler;
    if (/day/.test(unit)) {
      // there are 60 * 24 minutes in a day
      multipler = 60 * 24;
    } else if (/hour/.test(unit)) {
      // there are 60 minutes in an hour
      multipler = 60;
    } else { // assuming minute
      // there's 1 minute in a minute
      multipler = 1;
    }
    // add to the total amount of minutes
    totalMinutes += quantity * multipler;
  }

  return totalMinutes;
}

console.log(calculate('1 hour 5 mins')); // 65
console.log(calculate('2 hours 1 min')); // 121
console.log(calculate('3 hours')); // 180
console.log(calculate('10 mins')); // 10
console.log(calculate('1 day 5 hours')); // 1740
console.log(calculate('2 days 15 hours')); // 3780
console.log(calculate('3 days 16 hours 32 mins')); // 5312
console.log(calculate('2 hours')); // 120
console.log(calculate('1 day')); // 1440

您可以在以下容器中执行命令

version: '3'

services:
  nats:
    image: nats-streaming
  mongo:
    image: mongo