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/nullcom.microsoft.visualstudio.debuggee.arguments与路径的值bin/Debug/netcoreapp2.0/Web.dll/app使用com.microsoft.visualstudio.debuggee.workingdirectoryC:\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)
休息你所做的任何东西都被卷装置扔掉了.所以没有必要为调试做这件事.您可以使用多级构建方法来部署到生产,但不能用于调试.在您的项目中进行这两项更改后,调试开始为我工作
由于我的项目路径中存在锐利符号 ( #),因此出现了同样的问题(就像在 C# 中一样C:\Project\C#\MyProject\)。
从路径 ( C:\Project\C-sharp\MyProject\) 中删除了尖锐符号,我就可以开始了。
| 归档时间: |
|
| 查看次数: |
5043 次 |
| 最近记录: |