在 Docker 容器中运行标准 .NET 控制台应用程序

psy*_*cho 3 .net console-application docker docker-for-windows

我正在尝试将一个非常简单的控制台应用程序作为 Windows docker 容器运行。我有一个使用“dotnet-framework:4.7.2-runtime-windowsservercore-1803”基础映像的 docker 文件,如下所示。

FROM microsoft/dotnet-framework:4.7.2-runtime-windowsservercore-1803
ARG source
WORKDIR /app
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT "DockerConsoleApp.exe"
Run Code Online (Sandbox Code Playgroud)

控制台应用程序每 5 秒将“Hello World”输出到日志文件中”

static void Main(string[] args)
    {
        while (true)
        {
            try
            {
                Thread.Sleep(5000);
                _logger.Info("Hello Wolrd");
            }
            catch (Exception e)
            {
                //handle the exception 
                Console.Error.WriteLine(e);
            }
        }


    }
Run Code Online (Sandbox Code Playgroud)

我正在使用以下 docker compose 文件

version: '3.4'

services:
  dockerconsoleapp:
    image: dockerconsoleapp:dev
    build:
      context: .\
      args:
        source: obj\Docker\publish
    volumes:
      - C:\Users\user\source\repos\DockerConsoleApp\DockerConsoleApp:C:\app
      - C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\Remote Debugger:C:\remote_debugger:ro
      - C:\Users\user\source\repos\DockerConsoleApp\VolumeTest:C:\app\logs
Run Code Online (Sandbox Code Playgroud)

问题是,一旦我手动构建或运行“docker-compose up -d”,容器就会被创建,然后立即死亡。我希望容器应该保持运行状态,因为应用程序正在入口点中被调用,并且应用程序应该继续运行,除非手动停止。

psy*_*cho 5

最后,修复方法是将 dockerfile 中的 ENTRYPOINT 更改为 CMD。见下文。

FROM microsoft/dotnet-framework:4.7.2-runtime-windowsservercore-1803
ARG source
WORKDIR /app
COPY ${source:-obj/Docker/publish} .
CMD ["DockerConsoleApp.exe"]
Run Code Online (Sandbox Code Playgroud)

我已让它运行过夜,容器现在已运行 15 小时。