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

3
我正在尝试将一个非常简单的控制台应用程序作为Windows Docker容器运行。我有一个Docker文件,使用“dotnet-framework:4.7.2-runtime-windowsservercore-1803”基本镜像,如下所示:
FROM microsoft/dotnet-framework:4.7.2-runtime-windowsservercore-1803
ARG source
WORKDIR /app
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT "DockerConsoleApp.exe"

这个控制台应用程序每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);
            }
        }


    }

I am using the following docker compose file

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

问题在于,一旦我手动构建或运行“docker-compose up -d”,容器就会被创建,然后立即停止。 我期望容器应该保持运行状态,因为入口点中调用了应用程序,并且应用程序应该一直运行,除非手动停止。最初的回答。

1
你可能收到了异常。请检查你容器的 docker logs - Gregory Suvalian
docker logs 指向了我的问题所在。错误提示说 DockerConsoleApp 不被识别为内部命令。其他任何变体,如 .\DockerConsoleApp 等也都不行。我会更新并修复这个问题。 - psycho
这意味着您的容器镜像无效,与docker-compose或docker无关。您所说的“指向我的正确”是什么意思? - Gregory Suvalian
抱歉,打错了。Docker日志指引我朝正确的方向。我在FROM行下的Dockerfile中添加了"SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]"。然后,我将入口点更改为"ENTRYPOINT ".\DockerConsoleApp.exe""。这使得它能够运行更长时间,但在10秒后退出。 - psycho
2个回答

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"]

我让这个程序过夜运行,容器现在已经运行了15个小时。


2
您的容器很可能是由于ENTRYPOINT中的异常或ENTRYPOINT本身无效导致死亡。您可以检查docker logs以找出原因。

docker logs现在只输出".\DockerConsoleApp.exe"。我认为exe文件仍未运行,因为没有任何内容输出到我的本地卷位置。 - psycho
这似乎是由Visual Studio生成的。编写自己的dockerfile来了解docker的工作原理。我没有看到任何配置指定日志应该去哪里,根据你的入口点。你可以直接从应用程序输出到控制台来验证它是否运行,而不是在本地记录日志。 - Gregory Suvalian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接