Omnisharp在使用docker时静默崩溃



我正在docker中运行基本的dotnetcore示例,它运行得很好。一切都在构建,我的API可用。它也能倾听现场的变化,这是完美的。你可以在问题的底部找到Dockerfile和docker组合。

然而,我正试图使用Visual studio代码(内部人员和常规人员)和omnisharp(默认的c#扩展)来处理代码,但它一直困扰着我

它会工作几秒钟,然后让我遇到180多个"问题",所有这些都是假的(应用程序工作…)

输出没有指示任何imo(从重启到崩溃):

Starting OmniSharp server at 7/3/2018, 11:52:55 AM
Target: /home/mastermindzh/code/
OmniSharp server started
Path: /home/mastermindzh/.vscode-insiders/extensions/ms-vscode.csharp-1.15.2/.omnisharp/1.30.1/run
PID: 2323
[info]: OmniSharp.Stdio.Host
Starting OmniSharp on arch 0.0 (x64)
[info]: OmniSharp.MSBuild.Discovery.MSBuildLocator
Located 1 MSBuild instance(s)
1: StandAlone 15.0 - "/home/mastermindzh/.vscode-insiders/extensions/ms-vscode.csharp-1.15.2/.omnisharp/1.30.1/omnisharp/msbuild/15.0/Bin"
[info]: OmniSharp.MSBuild.Discovery.MSBuildLocator
MSBUILD_EXE_PATH environment variable set to '/home/mastermindzh/.vscode-insiders/extensions/ms-vscode.csharp-1.15.2/.omnisharp/1.30.1/omnisharp/msbuild/15.0/Bin/MSBuild.dll'
[info]: OmniSharp.MSBuild.Discovery.MSBuildLocator
Registered MSBuild instance: StandAlone 15.0 - "/home/mastermindzh/.vscode-insiders/extensions/ms-vscode.csharp-1.15.2/.omnisharp/1.30.1/omnisharp/msbuild/15.0/Bin"
MSBuildExtensionsPath = /home/mastermindzh/.vscode-insiders/extensions/ms-vscode.csharp-1.15.2/.omnisharp/1.30.1/omnisharp/msbuild
BypassFrameworkInstallChecks = true
CscToolPath = /home/mastermindzh/.vscode-insiders/extensions/ms-vscode.csharp-1.15.2/.omnisharp/1.30.1/omnisharp/msbuild/15.0/Bin/Roslyn
CscToolExe = csc.exe
MSBuildToolsPath = /home/mastermindzh/.vscode-insiders/extensions/ms-vscode.csharp-1.15.2/.omnisharp/1.30.1/omnisharp/msbuild/15.0/Bin
[info]: OmniSharp.Cake.CakeProjectSystem
Detecting Cake files in '/home/mastermindzh/code/'.
[info]: OmniSharp.Cake.CakeProjectSystem
Could not find any Cake files
[info]: OmniSharp.DotNet.DotNetProjectSystem
Initializing in /home/mastermindzh/code/
[info]: OmniSharp.DotNet.DotNetProjectSystem
Auto package restore: False
[info]: OmniSharp.DotNet.DotNetProjectSystem
Update workspace context
[info]: OmniSharp.DotNet.DotNetProjectSystem
Resolving projects references
[info]: OmniSharp.MSBuild.ProjectSystem
No solution files found in '/home/mastermindzh/code/'
[info]: OmniSharp.MSBuild.ProjectManager
Queue project update for '/home/mastermindzh/code//api/api.csproj'
[info]: OmniSharp.Script.ScriptProjectSystem
Detecting CSX files in '/home/mastermindzh/code/'.
[info]: OmniSharp.Script.ScriptProjectSystem
Could not find any CSX files
[info]: OmniSharp.Stdio.Host
Invoking Workspace Options Provider: OmniSharp.Roslyn.CSharp.Services.CSharpWorkspaceOptionsProvider
[info]: OmniSharp.Stdio.Host
Configuration finished.
[info]: OmniSharp.Stdio.Host
Omnisharp server running using Stdio at location '/home/mastermindzh/code/' on host 30096.
[info]: OmniSharp.MSBuild.ProjectManager
Loading project: /home/mastermindzh/code//api/api.csproj
[info]: OmniSharp.MSBuild.ProjectManager
Adding project '/home/mastermindzh/code//api/api.csproj'
[info]: OmniSharp.MSBuild.ProjectManager
Update project: api

在这之后,扩展就不再工作了,直到我重新启动它,它又崩溃了。这只会在Docker或cli中启动时失败,如果我通过vscode运行应用程序(这是我不想做的),它会正常工作。

Dockerfile:

FROM microsoft/dotnet:2.1-sdk-stretch
WORKDIR /app
EXPOSE 5000
CMD dotnet restore && dotnet watch run

组成:

version: "3"
services:
web:
build:
context: ./../../api
dockerfile: ./../docker/images/api/Dockerfile
ports:
- "5000:5000"
- "5001:5001"
volumes:
- ./../../api/:/app
depends_on:
- db

到目前为止,我的最佳猜测是,这与dotnet恢复和/或bin/obj文件夹有关。运行一个网络清理然后启动应用程序没有什么区别。

如有任何帮助,我们将不胜感激。

嗨,里克,你能弄清楚吗?我遇到了同样的问题,试图在docker容器中使用Omnisharp扩展来运行调试器。

我看到了你提到的bin/obj引用,这似乎是由于.net如何配置运行时环境。这似乎是基于dotnet共享文件夹的位置。这篇文章解释了其中的一部分:msbuild';的目的是什么;s生成运行时配置文件?

我认为问题是,这个共享文件夹与实际的主机(我运行的机器)不同,而与docker容器上的不同。因此,当您在容器中运行dotnet时,它会根据容器中的内容配置运行时。由于Omnisharp在容器外运行,因此它会被抛出。

我认为我们可以将这些共享文件夹定义为dockerfile(或docker-compose)的一部分并进行卷装载。但我还没有找到工作。我知道这是几个月前的事了,但看看你是否明白了。谢谢

我有一个更新。如果你还在做这件事,也许这会有所帮助。

因此,正如我在上一篇文章中提到的,问题是你的VSCode调试器在docker容器之外运行。您需要的是在该容器中启动一个远程调试器,然后将VSCode附加到其中

我在这里举了一个例子。这是一个控制台应用程序。https://github.com/sleemer/docker.dotnet.debug

我为webapi和mvc应用程序扩展了上面的例子。你可以在这里看到:https://github.com/johnlee/dockerdotnetcorevscode

我也写了一篇文章,尽管它主要是我自己的笔记,所以可能不是最容易阅读的。https://solidfish.com/building-net-core-apps-docker-with-vscode-on-mac-or-windows/

另一个选项是在docker容器中实际运行VSCode。这可能有点过头了,但这似乎是可能的。https://www.aaron-powell.com/posts/2017-09-21-vscode-linux-docker-windows/

我设法找到了一个配置,使其在使用";使用docker compose+dotnet watch映射项目文件夹";它提供代码的实时更新,而不必每次都重新构建容器。

首先,我将发布完整的docker-compose.yml,然后我将解释必要的配置。

这是.NET项目(需要使用VSCode扩展)的完整docker-compose.yml

services:
dotnet-api:
image: mcr.microsoft.com/dotnet/core/sdk:2.2.402
command: [sh, -c, "dotnet watch run"]
working_dir: /app
volumes:
- .:/app
- /usr/bin/dotnet:/usr/bin/dotnet
- /usr/share/dotnet:/usr/share/dotnet
- ${HOME}/.nuget:${HOME}/.nuget
environment:
HOME: /home/${USER}

请注意,我在这里使用的是.NET SDK 2.2(因为我在维护一个遗留应用程序),但您应该能够根据自己的需要进行调整。此外,您可能需要将working_dir变量更改为API csproj文件所在的路径,或者指定要使用dotnet watch run --project YourProject.API/YourProject.API.csproj运行的项目。

现在是逐步解释。

将.NET环境装入容器

VS代码C#扩展和omnisharp的通信主要通过dotnetcli工具与omnisharp-sdk交互,因此您也必须将其映射到您的容器,因此这些行:

services:
dotnet-api:
volumes:
- /usr/bin/dotnet:/usr/bin/dotnet
- /usr/share/dotnet:/usr/share/dotnet

请注意,这将覆盖容器中的sdk,因此您首先会失去使用sdk容器的一点好处。

将当前用户$HOME映射到容器

您还需要将当前用户nuget文件夹映射到omnisharp所期望的路径中的容器,即$HOME/.nuget,但仅装载.nuget文件夹是不够的,因为该容器没有设置$HOME变量,如果不设置,omnishar将在根文件夹中查找包,但会失败,因为它没有权限。

所以你加上这些行:

services:
dotnet-api:
volumes:
- ${HOME}/.nuget:${HOME}/.nuget
environment:
HOME: /home/${USER}

这应该能够使VS代码的C#扩展停止显示错误,但使用此解决方案,调试器可能无法工作,因为您需要附加到运行可执行文件的进程,这完全是另一个问题。


尽管我正在覆盖容器中的SDK,这会失去Docker的一点好处,但我仍然喜欢使用Docker compose,这样我就可以轻松地旋转多个容器,并在必要时尝试新的容器,所以这个配置对我来说仍然值得,因为它只在开发环境中使用。

最新更新