Почему контейнер, в котором запущено консольное приложение, просто закрывается после запуска - PullRequest
1 голос
/ 28 мая 2020

Я хочу запустить простое приложение консоли do tnet core в контейнере в интерактивном режиме. Я не могу этого сделать, и контейнер просто запускается, а затем немедленно закрывается, не запуская программу полностью.

Все, что есть в консольном приложении, - это следующие три оператора.

Console.WriteLine("Hello World!");
var readText = Console.ReadLine(); // Wait for me to enter some text
Console.WriteLine(readText);

Последние две строки делают его интерактивным.

Когда я запускаю контейнер, он печатает Привет мир! Но потом сразу выходит, не дожидаясь ввода текста. Зачем? Что мне не хватает?

Мне удалось запустить основное веб-приложение do tnet в контейнере аналогичным образом, и я могу сопоставить порты снаружи и внутри контейнера для успешного просмотра веб-страниц приложение. Но когда дело доходит до консольного приложения, я в тупике.

Думаю, может быть что-то очень простое, чего мне не хватает. Сводит меня с ума

Шаги для воспроизведения, как описано ниже.

  1. Запустите Vs2019 и создайте новый. net проект основной консоли.

New DotNet Core Console Project Creation

Добавьте пару операторов, чтобы сделать его интерактивным.

Simple DotNet Core Console App

Добавить поддержку Docker в созданный проект. Щелкните проект правой кнопкой мыши, «Добавить» -> выберите «Поддержка оркестратора контейнеров»

Adding Docker Support To Console App

Adding Container Orchestrator Support With Docker Compose.jpg

Docker Linux Containers

Теперь Visual Studio создает набор файлов и также изменяет файл csproj.

Solution Folder In Windows Explorer

Project Folder In Windows Explorer

Solution Explorer After Adding Docker Support

В PowerShell перейдите в папку с файлом решения. Выполните команду «docker -compose up»

Docker-Compose Command InPowerShell

После того, как образы созданы и контейнеры запущены и работают, мы можем увидеть начало, чтобы увидеть проблему.

Docker Start Container

Мы видим здесь Hello-World !. Но он не ждет, когда я что-то наберу . Наберите docker ps -a и увидите закрытый контейнер. Когда я пытаюсь запустить это с помощью docker start -i или docker start -a, контейнер запускается, но немедленно закрывается. Что мне делать, чтобы запустить контейнер, чтобы я мог напечатать что-нибудь для моего приложения, работающего в нем? Вы также можете увидеть это на рабочем столе docker. Даже если я запустил их (используя кнопку запуска, доступную в пользовательском интерфейсе рабочего стола docker для каждого контейнера), он просто снова остановится.

Docker Containers In Docker Desktop

Я запускал веб-приложения в контейнерах. При правильном сопоставлении портов веб-приложение, работающее внутри контейнера, может быть доступно извне. Я создал базовое веб-приложение do tnet в аналогичных строках, описанных выше, изменил файл docker -compose, чтобы включить отображение портов (показано ниже), и когда я выполняю docker -compose, приложение запускается и работает . Но с консольным приложением контейнер просто закрывается.

Docker file With Port Mapping For WebApp

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

По умолчанию у вас нет интерактивного TTY, когда контейнер запускается с docker-compose up.

Вам необходимо добавить это в свою службу:

stdin_open: true
tty: true
0 голосов
/ 04 июня 2020

Я обнаружил, что Docker compose run является альтернативой команде up.

docker-compose run <service name from docker-compose.yml file> 

В частности, для моего приложения файл docker compose выглядит следующим образом.

version: '3.4'

services:
  dokconsoleapp:
    image: ${DOCKER_REGISTRY-}dokconsoleapp
    build:
      context: .
      dockerfile: DokConsoleApp/Dockerfile
#    stdin_open: true
#    tty: true

Обратите внимание, что последние две строки закомментированы.

Теперь если я запускаю

docker-compose run dokconsoleapp

Контейнер работает до конца программы, интерактивно ожидая, пока я введу ввод после Hello-World!.

Операторы So

    stdin_open: true
    tty: true

не нужны, если вы используете run с docker -compose вместо up

...