docker-compose не присоединяет стандартный ввод к основному приложению .net Console.ReadLine - PullRequest
0 голосов
/ 20 октября 2018

Я заметил странное поведение при использовании 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 см. здесь

Спасибо.

PS: если бы вы могли улучшить заголовок этого вопроса, я был бы счастлив.

1 Ответ

0 голосов
/ 20 октября 2018

Вы можете найти отдельный контейнер и выполнить команду в этом контейнере.Docker compose транслирует ваши логи, поэтому не предоставляет интерактивной оболочки.

В качестве примера предположим, что у вас есть этот файл композиции,

version: '3'

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

Вы можете выполнить команду в каждом контейнере, как показано ниже

docker-compose exec mongo sh
docker-compose exec nats sh
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...