为什么运行控制台应用程序的容器在启动后就退出

Viv*_*Dev 3 docker .net-core docker-compose

我想在容器中以交互方式运行一个简单的 dotnet core 控制台应用程序。我无法做到这一点,容器只是启动然后立即退出,而没有完全运行程序。

控制台应用程序只有以下三个语句。

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

最后两行使其具有交互性。

当我运行容器时,它会打印 Hello World! 但它立即退出,没有等我输入一些文本。为什么?我缺少什么?

我能够以类似的方式在容器中运行 dotnet core Web 应用程序,并且能够映射容器外部和容器内部的端口以成功浏览 Web 应用程序。但当谈到控制台应用程序时,我被难住了。

我想我可能缺少一些非常简单的东西。使我抓狂

重现步骤如下所述。

  1. 启动 Vs2019 并创建一个新的 .net core 控制台项目。

新的 DotNet Core 控制台项目创建

  1. 添加一些语句以使其具有交互性。

简单的 DotNet Core 控制台应用程序

  1. 为创建的项目添加 Docker 支持。右键单击项目,添加 -> 选择 Container Orchestrator 支持

向控制台应用程序添加 Docker 支持

使用 Docker Compose.jpg 添加容器编排器支持

Docker Linux 容器

  1. 现在,Visual Studio 创建了一组文件并更改了 csproj 文件。

Windows 资源管理器中的解决方案文件夹

Windows 资源管理器中的项目文件夹

添加 Docker 支持后的解决方案资源管理器

  1. 在 powershell 中导航到包含解决方案文件的文件夹。运行命令“docker-compose up”

PowerShell 中的 Docker-Compose 命令

  1. 一旦构建了镜像,并且容器启动并运行,我们就可以开始发现问题。

Docker启动容器

  1. 我们可以在这里看到Hello-World!。但它不会等我输入一些东西。键入 docker ps -a 并查看退出的容器。当我尝试使用 docker start -i 或 docker start -a 启动该容器时,容器启动但立即退出。我应该怎么做才能使容器运行,以便我可以为在其中运行的应用程序输入一些内容?您也可以在 docker 桌面中看到。即使我启动它们(使用每个容器的 docker 桌面 UI 提供的启动按钮),它也会再次停止。

Docker 桌面中的 Docker 容器

  1. 我在容器中运行网络应用程序。通过正确的端口映射,可以从外部访问在容器内部运行的 Web 应用程序。我用上述类似的行创建了一个 dotnet core Web 应用程序,修改了 docker-compose 文件以包含端口映射(如下所示),当我执行 docker-compose up 时,该应用程序已启动并运行。但对于控制台应用程序,容器只需退出即可。

具有 WebApp 端口映射的 Docker 文件

jma*_*nry 5

默认情况下,当容器以 启动时,您没有交互式 TTY docker-compose up。

您需要将其添加到您的服务中:

stdin_open: true
tty: true
Run Code Online (Sandbox Code Playgroud)