Docker:应用程序通过docker-compose工作正常,但是如何通过Visual Studio和调试运行它?

use*_*173 9 c# visual-studio docker docker-compose asp.net-core

我有几个项目,他们必须在单独的容器中运行,我有一些共享库也应该是buit.我发现了以下文章如何做到这一点.我将仅显示一个项目的docker文件,因为它们非常相似:

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0 AS builder
WORKDIR /src
COPY *.sln ./
COPY Web/Web.csproj Web/
RUN dotnet restore
COPY . .
WORKDIR /src/Web
RUN dotnet build -c Debug -o /app

FROM builder AS publish
RUN dotnet publish -c Debug -o /app

FROM base AS production
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Web.dll"]
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到使用多阶段建筑.如果我使用,docker-compose up那么一切正常.接下来,我试图通过Visual Studio运行它,我看到Output窗口中的所有步骤,但最后我收到以下错误:

目标进程退出但未引发CoreCLR启动事件.确保将目标进程配置为使用.NET Core.如果目标进程未在.NET Core上运行,则可能会出现这种情况.程序'[13] dotnet'退出代码145(0x91).程序''已退出代码145(0x91).

但是现在如何调试应用程序呢?这是github repo的链接.

PS.对于Tarun,VS生成的默认docker文件

FROM microsoft/aspnetcore:2.0
ARG source
WORKDIR /app
EXPOSE 80
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "Web.dll"]
Run Code Online (Sandbox Code Playgroud)

Tar*_*ani 20

TL; DR;

所以我安装了VS 2017并对此进行了深入研究以了解这里发生了什么.在查看项目的构建过程后,我在下面找到了

docker-compose -f"C:\ Users\tarlabs\Desktop\AspNetCoreMultiProject\docker-compose.yml"-f"C:\ Users\tarlabs\Desktop\AspNetCoreMultiProject\docker-compose.override.yml"-f"C:\Users\tarlabs\Desktop\AspNetCoreMultiProject\obj\Docker\docker-compose.vs.debug.g.yml"-p dockercompose15184637154516733497 kill

泊坞窗,compose.override.yml

version: '3'

services:
  web:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    ports:
      - "80"

  api:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    ports:
      - "80"
Run Code Online (Sandbox Code Playgroud)

哪个不太感兴趣.

泊坞窗,compose.vs.debug.g.yml

version: '3'

services:
  api:
    image: api:dev
    build:
      args:
        source: obj/Docker/empty/
    environment:
      - DOTNET_USE_POLLING_FILE_WATCHER=1
      - NUGET_FALLBACK_PACKAGES=/root/.nuget/fallbackpackages
    volumes:
      - C:\Users\tarlabs\Desktop\AspNetCoreMultiProject:/app
      - C:\Users\tarlabs\vsdbg:/remote_debugger:ro
      - C:\Users\tarlabs\.nuget\packages\:/root/.nuget/packages:ro
      - C:\Program Files\dotnet\sdk\NuGetFallbackFolder:/root/.nuget/fallbackpackages:ro

    entrypoint: tail -f /dev/null
    labels:
      com.microsoft.visualstudio.debuggee.program: "dotnet"
      com.microsoft.visualstudio.debuggee.arguments: " --additionalProbingPath /root/.nuget/packages --additionalProbingPath /root/.nuget/fallbackpackages  bin/Debug/netcoreapp2.0/Api.dll"
      com.microsoft.visualstudio.debuggee.workingdirectory: "/app"
      com.microsoft.visualstudio.debuggee.killprogram: "/bin/bash -c \"if PID=$$(pidof -x dotnet); then kill $$PID; fi\""

  web:
    image: web:dev
    build:
      args:
        source: obj/Docker/empty/
    environment:
      - DOTNET_USE_POLLING_FILE_WATCHER=1
      - NUGET_FALLBACK_PACKAGES=/root/.nuget/fallbackpackages
    volumes:
      - C:\Users\tarlabs\Desktop\AspNetCoreMultiProject:/app
      - C:\Users\tarlabs\vsdbg:/remote_debugger:ro
      - C:\Users\tarlabs\.nuget\packages\:/root/.nuget/packages:ro
      - C:\Program Files\dotnet\sdk\NuGetFallbackFolder:/root/.nuget/fallbackpackages:ro

    entrypoint: tail -f /dev/null
    labels:
      com.microsoft.visualstudio.debuggee.program: "dotnet"
      com.microsoft.visualstudio.debuggee.arguments: " --additionalProbingPath /root/.nuget/packages --additionalProbingPath /root/.nuget/fallbackpackages  bin/Debug/netcoreapp2.0/Web.dll"
      com.microsoft.visualstudio.debuggee.workingdirectory: "/app"
      com.microsoft.visualstudio.debuggee.killprogram: "/bin/bash -c \"if PID=$$(pidof -x dotnet); then kill $$PID; fi\""
Run Code Online (Sandbox Code Playgroud)

几件有趣的事情

  • ENTRYPOINT我们定义不会使调试过程中的不同,因为它通过与VS覆盖tail -f /dev/null
  • com.microsoft.visualstudio.debuggee.arguments与路径的值bin/Debug/netcoreapp2.0/Web.dll
  • 调试的工作目录始终设置为/app使用com.microsoft.visualstudio.debuggee.workingdirectory
  • 卷装 C:\Users\tarlabs\Desktop\AspNetCoreMultiProject:/app

看着Volume mount C:\Users\tarlabs\Desktop\AspNetCoreMultiProject:/app,我就像哇!您/app在Dockerfile 中的文件夹中拥有的任何内容都将被该安装覆盖.因此,无论您是将文件构建并放入其中,还是不做任何事情都无济于事.

现在我进入容器内部并意识到这Web.dll是内部人员,/app/Web/bin/Debug/netcoreapp2.0/Web.dll但调试人员期待它开启/app/bin/Debug/netcoreapp2.0/Web.dll.在查看每个设置后,我无法在任何地方找到此路径.

然后我玩了一个新项目.使用Docker支持添加一个项目,然后添加另一个支持docker的项目.这给了我一个提示的docker-compose.yml

version: '3'

services:
  webapplication1:
    image: webapplication1
    build:
      context: ./WebApplication1
      dockerfile:Dockerfile

  webapplication2:
    image: webapplication2
    build:
      context: ./../WebApplication2
      dockerfile: Dockerfile
Run Code Online (Sandbox Code Playgroud)

这给了我一个暗示,动态docker-compose.vs.debug.g.yml文件根据你的上下文给出的上下文进行卷装入docker-compose.yml.现在看看你的项目.

泊坞窗,compose.yml

version: '3'

services:
  web:
    image: web
    build:
      context: .
      dockerfile: Web/Dockerfile

  api:
    image:api
    build:
      context: .
      dockerfile: Api/Dockerfile
Run Code Online (Sandbox Code Playgroud)

由于上下文.是生成卷装载

- C:\Users\tarlabs\Desktop\AspNetCoreMultiProject:/app
Run Code Online (Sandbox Code Playgroud)

为了纠正我们更新我们docker-compose.yml

version: '3'

services:
  web:
    image: web
    build:
      context: ./Web
      dockerfile: Dockerfile

  api:
    image:api
    build:
      context: ./Api
      dockerfile: Dockerfile
Run Code Online (Sandbox Code Playgroud)

接下来我们的Dockerfile做了很多事情,VS调试器只是忽略了.因此,您只需要2行就可以Dockerfile进行调试以实际工作

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
Run Code Online (Sandbox Code Playgroud)

休息你所做的任何东西都被卷装置扔掉了.所以没有必要为调试做这件事.您可以使用多级构建方法来部署到生产,但不能用于调试.在您的项目中进行这两项更改后,调试开始为我工作

调试工作


Max*_* R. 6

由于我的项目路径中存在锐利符号 ( #),因此出现了同样的问题(就像在 C# 中一样C:\Project\C#\MyProject\)。

从路径 ( C:\Project\C-sharp\MyProject\) 中删除了尖锐符号,我就可以开始了。