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

use*_*162 5 docker .net-core docker-compose

使用时,我注意到了奇怪的行为docker-composeConsole.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果通过docker run -i readline 运行,效果很好

在此处输入图片说明

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

在此处输入图片说明

这是为什么?

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

git clone https://github.com/mh-qUjB/docker-dotnetcore-readline.git
cd ./docker-dotnetcore-readline/ReadLine
docker-compose up
Run Code Online (Sandbox Code Playgroud)

我目前正在对此进行测试:

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

谢谢。

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

Hal*_*mak 2

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

例如,假设您有这个撰写文件,

version: '3'

services:
  nats:
    image: nats-streaming
  mongo:
    image: mongo
   
Run Code Online (Sandbox Code Playgroud)

您可以在每个容器中执行命令,如下所示

docker-compose exec mongo sh
docker-compose exec nats sh
Run Code Online (Sandbox Code Playgroud)