如何在Docker容器内交互式运行dotnet核心控制台应用程序

时间:2020-06-03 11:39:33

标签: docker .net-core docker-compose

我从Visual Studio 2019创建了以下简单的dotnet核心控制台应用程序。

Console.WriteLine("Hello World!");
var readText = Console.ReadLine();
Console.WriteLine(readText);

当我按F5键时,程序会在Console.ReadLine等我,直到输入一些文本。当我键入一些文本并按Enter键时,相同的文本会显示给我。

现在我将docker支持添加到该控制台项目。我在另一个so question中编写了逐步说明,以添加Docker支持。

添加docker支持后,在命令提示符下,导航到docker-compose文件所在的文件夹并发出命令

docker-compose up

应用程序运行,打印Hello World!。然后显然它停止了,并等待我输入一些文本。但是,当我键入文本并按Enter时,什么也没有发生。似乎我在控制台上提供的输入没有传达给在容器内部运行的应用程序。

NetCore Console App running inside of a docker container

我想念什么?为什么在容器内部运行的应用程序无法接收我的输入?只需按Ctrl + C,容器即会退出。

注意,如果容器立即退出,则必须按照同一so question's answer中的说明,将以下内容添加到docker-compose文件中。这样可以防止容器立即退出。

stdin_open: true
tty: true

1 个答案:

答案 0 :(得分:2)

默认情况下启用标准输入和TTY。

代替docker-compose up运行

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

从docker文档粘贴:

https://docs.docker.com/compose/reference/run/

对服务运行一次性命令。例如,以下命令启动Web服务并运行bash作为其命令。

docker-compose运行Web bash

两个区别:

首先,运行传递的命令将覆盖服务配置中定义的命令。例如,如果Web服务配置以bash开始,则docker-compose run web python app.py会被python app.py覆盖。

第二个区别是docker-compose run命令不会创建服务配置中指定的任何端口。这样可以防止端口与已经打开的端口发生冲突。如果确实要创建服务的端口并将其映射到主机,请指定--service-ports标志:

相关问题