【问题标题】:Omnisharp silently crashes when working with docker使用 docker 时,Omnisharp 静默崩溃
【发布时间】:2018-12-11 15:27:05
【问题描述】:

我在 docker 中运行 basic dotnetcore example,它运行良好。一切都在构建,我的 API 可用。它还可以收听完美的实时变化。您可以在问题底部找到 Dockerfile 和 docker-compose。

但是,我正在尝试使用 Visual-studio-code(内部人员和常规)结合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 restore 和/或 bin/obj 文件夹有关。运行 dotnet clean 然后启动应用程序没有区别。

任何帮助将不胜感激。

【问题讨论】:

    标签: docker visual-studio-code .net-core


    【解决方案1】:

    嗨,Rick,你能解决这个问题吗?我遇到了同样的问题,尝试在 docker 容器内使用 Omnisharp 扩展运行调试器。

    我看到了你提到的那些 bin/obj 引用,这似乎是由于 .net 如何配置运行时环境。这似乎是基于 dotnet 共享文件夹的位置。这篇文章解释了其中的一部分: What is the purpose of msbuild's GenerateRuntimeConfigurationFiles?

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

    我认为我们可以将这些共享文件夹定义和卷挂载为 dockerfile(或 docker-compose)的一部分。但我还没有得到一些工作。我知道这是几个月前的事,但请检查您是否发现了这一点。谢谢!

    【讨论】:

    • 我没有让它工作,不。我在 github 上创建了一个问题,但到目前为止也没有得到答复。我们能做的最好的事情就是希望对这个问题/这个问题进行投票,让更多的人看到它。
    • 感谢您的更新。我会密切关注 github 方面的进展情况。如果在那之前我确实想出了其他东西,我会再次在这里发帖。再次感谢!
    【解决方案2】:

    我有更新。如果您仍在工作,也许这会有所帮助。

    正如我之前的帖子中提到的,问题在于您的 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/

    【讨论】:

      【解决方案3】:

      我设法找到了一种配置,使其在使用“使用 docker compose + dotnet watch 映射项目文件夹”的工作流程时可以使用,它可以实时更新代码,而无需每次都重新构建容器。

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

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

      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 Code C# extension and omnisharp interact with the omnisharp sdk mainly through the dotnet cli tool 的通信,因此您也必须将其映射到您的容器,因此这些行:

      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 变量设置,如果不设置,omnisharp 会在根文件夹中查找包,会失败,因为它没有权限。

      所以你添加这些行:

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

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


      尽管我重写了容器内的 SDK,这失去了一点 Docker 的好处,但我仍然喜欢使用 docker compose,这样我就可以轻松启动多个容器并尝试新的容器必要的,所以这个配置对我来说还是值得的,因为它只在开发环境中使用。

      【讨论】:

        猜你喜欢
        • 2020-06-26
        • 1970-01-01
        • 2016-11-25
        • 2017-02-22
        • 1970-01-01
        • 2021-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多