【发布时间】:2017-12-29 22:57:58
【问题描述】:
我是否应该使用 docker logs 命令从 .NET Core 控制台应用程序 dockerized(Linux 映像)中查看控制台输出 (Console.WriteLine)?
【问题讨论】:
-
是的,你应该看到它
-
日志不显示,因为容器主进程是“tail -f /dev/null”
我是否应该使用 docker logs 命令从 .NET Core 控制台应用程序 dockerized(Linux 映像)中查看控制台输出 (Console.WriteLine)?
【问题讨论】:
发现在调试模式下,应用只写入调试输出控制台。因此,如果您在本地调试容器上运行docker logs,则什么都不会。如果您在发布模式下运行容器,那么在运行 docker logs 时会显示日志
【讨论】:
想扩展@Cale's 答案。
就像他说的:
让我们看看容器,了解发生了什么。
基础知识:docker 日志将从定义的入口点启动的进程的 stdout 和 stderr 提供。通过Dockerfile 和/或docker-compose.yml 定义。
在构建镜像(没有 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
【讨论】:
是的。如果您使用默认的日志记录驱动程序,您可以看到写入 stdout 和 stderr 的日志。
默认情况下,docker logs 会显示命令的 STDOUT 和 STDERR。
【讨论】: