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
docker-compose.override.yml
version: '3'
services:
web:
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "80"
api:
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "80"
这不是很有趣。
docker-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\""
一些有趣的事情
- 我们定义的
ENTRYPOINT 在调试过程中不会产生影响,因为它被VS 用tail -f /dev/null 覆盖
-
com.microsoft.visualstudio.debuggee.arguments 具有路径为bin/Debug/netcoreapp2.0/Web.dll 的值
- 调试的工作目录总是使用
com.microsoft.visualstudio.debuggee.workingdirectory设置为/app
- 卷装
C:\Users\tarlabs\Desktop\AspNetCoreMultiProject:/app
看着卷挂载C:\Users\tarlabs\Desktop\AspNetCoreMultiProject:/app,我就像哇! Dockerfile 中 /app 文件夹中的任何内容都将被该挂载覆盖。因此,无论您是构建文件并将其放入其中还是不做任何事情都不会产生影响。
现在我进入容器并意识到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
这给了我一个提示,动态docker-compose.vs.debug.g.yml 文件根据docker-compose.yml 中给出的上下文进行卷挂载。现在查看您的项目。
docker-compose.yml
version: '3'
services:
web:
image: web
build:
context: .
dockerfile: Web/Dockerfile
api:
image:api
build:
context: .
dockerfile: Api/Dockerfile
由于上下文是.,因此卷安装生成为
- C:\Users\tarlabs\Desktop\AspNetCoreMultiProject:/app
为了更正我们将docker-compose.yml更新为
version: '3'
services:
web:
image: web
build:
context: ./Web
dockerfile: Dockerfile
api:
image:api
build:
context: ./Api
dockerfile: Dockerfile
接下来,我们的 Dockerfile 做了太多被 VS 调试器忽略的事情。因此,您只需要在 Dockerfile 中添加 2 行代码即可进行实际调试
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
Rest 你所做的任何事情都只是被卷安装扔掉了。因此,为了调试而这样做是没有意义的。您可以使用多阶段构建方法部署到生产环境,但不能用于调试。在您的项目中进行这两项更改后,调试开始为我工作