.NET Core控制台应用程序的输出,通过Docker日志输出

13

我使用 Docker 将 .NET Core 控制台应用程序(Linux 镜像)部署后,能否通过使用 docker logs 命令查看控制台输出(Console.WriteLine)?


是的,你应该看到它。 - pr177
日志没有显示出来,因为容器的主进程是“tail -f /dev/null”。 - user4182277
3个回答

7

发现在调试模式下,该应用仅将内容写入调试输出控制台。因此,如果您在本地调试容器上运行docker logs,则什么也不会显示。如果在发布模式下运行容器,则运行docker logs时日志将存在。


3

希望扩展@Cale的答案。

就像他所说:

  • 使用VS调试:Docker日志不起作用
  • 构建和启动镜像而不使用VS:Docker日志有效

让我们查看容器,以了解发生了什么。

基础知识:docker日志将从指定入口点启动的进程的标准输出和标准错误中提取。通过Dockerfile和/或docker-compose.yml定义。

在docker构建后,常规docker用例,无调试

在构建镜像(不使用VS)并通过docker run启动它后,它看起来像这样。

$ docker build -t my-project:dev Dockerfile .

$ docker inspect -f '{{json .Config.Entrypoint}}' my-project:dev
["dotnet","MyProject.dll"] 

应用程序的Entrypoint是我们的应用程序,因此docker将读取我们的应用程序的stdout和stderr,并创建日志。

调试

简单来说:docker镜像的entry-point是`tail -f /dev/null` -> 没有docker日志,永远没有。在容器运行时没有你的应用程序运行时,VS-Debug通过`docker exec MyAppContainer 'sh -c vsdbg...'`启动应用程序->所有输出(stdout、stderr、debug)都会到达VS。
tldr;
这里变得有趣了 ;)
VS Debug将创建一个容器,看起来像这样:
docker inspect -f '{{json .Config.Entrypoint}}' MyProjectName
["tail","-f","/dev/null"]

前面提到的 tail -f /dev/null 入口点。 Docker 将从该进程中读取 > 因此什么也没有。 实际上,我们的应用程序根本没有通过常规的 Docker 机制启动!

那么我们的应用程序调试会话是如何启动的呢? 让我们连接到镜像并查看一下。

root@2e65795bcd7e:/app# pstree -p 0 -A -T -a
?,
 |-sh,1394 -c...
 |   `-vsdbg,1401 --interpreter=vscode
 |       `-dotnet,1414 --additionalProbingPath /root/.nuget/packages --additionalProbingPath /root/.nuget/fallbackpackages /app/bin/Debug/net5.0/MyApp.dll
 `-tail,1 -f /dev/null

在底部是我们的入口点启动了tail -f /dev/null,而在顶部是sh -c vsdbg ... dotnet ... MyApp.dll。当您停止和开始调试时,您可以看到这个进程如何消失和重新出现。
因此,VS做了类似于以下操作:
docker exec MyAppContainer 'sh -c vsdbg --interpreter=vscode'

这将启动您的应用程序作为子级

dotnet --additionalProbingPath /root/.nuget/packages --additionalProbingPath /root/.nuget/fallbackpackages /app/bin/Debug/net5.0/MyApp.dll

谢谢您的评论 - 我知道这是一个相当古老的问题。我在Mac上遇到了这个问题,在我的Windows电脑上从未发生过...Windows一定在做某些不同的事情。 - cr1pto

-1

是的。如果您使用默认的日志驱动程序,则可以查看写入标准输出和标准错误的日志。

默认情况下,docker logs 显示命令的 STDOUT 和 STDERR。

查看容器或服务的日志


3
很奇怪,但我无法看到这个输出。如果我使用调试运行应用程序,则可以在 VS 调试控制台中看到输出。如果我不使用调试运行,则可以在 VS Docker 控制台中看到输出。但是,如果我从 docker 命令运行应用程序,则无法看到输出。 - dawid
我应该提到这是在 Windows 上运行的 Docker,使用 Linux 作为主机系统(我认为是 Hyper-V 虚拟机)。 - dawid
你可以在这里发布你的 Dockerfile 吗? - dvnguyen
这是我的Dockerfile: FROM microsoft/dotnet:2.0-runtime ARG source WORKDIR /app COPY ${source:-obj/Docker/publish} . ENTRYPOINT ["dotnet", "DockerOutputTest.dll"] - dawid
ASP.Net MVC应用程序使用的标准输出版本是什么? - Unbreakable

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