【问题标题】:Output from .NET Core console app by docker logsdocker logs 从 .NET Core 控制台应用程序的输出
【发布时间】:2017-12-29 22:57:58
【问题描述】:

我是否应该使用 docker logs 命令从 .NET Core 控制台应用程序 dockerized(Linux 映像)中查看控制台输出 (Console.WriteLine)?

【问题讨论】:

  • 是的,你应该看到它
  • 日志不显示,因为容器主进程是“tail -f /dev/null”

标签: docker logging .net-core


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    想扩展@Cale's 答案。

    就像他说的:

    • 使用 VS 调试:Docker 日志不起作用
    • 在没有 VS 的情况下构建和启动映像:Docker 日志工作

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

    基础知识:docker 日志将从定义的入口点启动的进程的 stdout 和 stderr 提供。通过Dockerfile 和/或docker-compose.yml 定义。

    docker build 后的“regular docker usecase”,没有调试

    在构建镜像(没有 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-image 入口点是 tail -f /dev/null -> 没有 docker 日志,永远不会。 在容器运行而您的应用程序不运行后,VS-Debug 通过docker exec MyAppContainer 'sh -c vsdbg ...' 启动应用程序 -> 所有输出(stdout、stderr、调试)都转到 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
    

    【讨论】:

      【解决方案3】:

      是的。如果您使用默认的日志记录驱动程序,您可以看到写入 stdout 和 stderr 的日志。

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

      View logs for a container or service

      【讨论】:

      • 这很奇怪,但我看不到这个输出。如果我正在运行带调试的应用程序,我可以在 VS 调试控制台中看到输出。如果我在没有调试的情况下运行,我可以在 VS Docker 控制台中看到输出。但是如果我从 docker 命令运行应用程序,我看不到输出
      • 我应该提到这是在 Windows 上运行的 Docker,以 linux 作为主机系统(我认为是 Hyper-V 机器)
      • 你能把你的 dockerfile 贴在这里吗?
      • 这是我的 Dockerfile: FROM microsoft/dotnet:2.0-runtime ARG source WORKDIR /app COPY ${source:-obj/Docker/publish} 。入口点 ["dotnet", "DockerOutputTest.dll"]
      • 用于 ASP.Net MVC 应用程序的 STDOUT 版本是什么?
      猜你喜欢
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      • 2020-04-14
      • 2010-09-16
      • 1970-01-01
      • 2016-11-02
      相关资源
      最近更新 更多