我使用 Docker 将 .NET Core 控制台应用程序(Linux 镜像)部署后,能否通过使用 docker logs 命令查看控制台输出(Console.WriteLine)?
发现在调试模式下,该应用仅将内容写入调试输出控制台。因此,如果您在本地调试容器上运行docker logs
,则什么也不会显示。如果在发布模式下运行容器,则运行docker logs
时日志将存在。
希望扩展@Cale的答案。
就像他所说:
让我们查看容器,以了解发生了什么。
基础知识:docker日志将从指定入口点启动的进程的标准输出和标准错误中提取。通过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"]
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
。当您停止和开始调试时,您可以看到这个进程如何消失和重新出现。docker exec MyAppContainer 'sh -c vsdbg --interpreter=vscode'
这将启动您的应用程序作为子级
dotnet --additionalProbingPath /root/.nuget/packages --additionalProbingPath /root/.nuget/fallbackpackages /app/bin/Debug/net5.0/MyApp.dll