VS code docker 调试 asp.net core

前言

.net core的诞生就是为了解决跨平台的事情的,所以.net core app运行在linux、macOS、docker上也不是什么新鲜事了。

相信已经有不少.net core的项目已经部署在docker或者linux的环境下。但是一般的开发人员的开发环境不会是Ubuntu、redhat什么的,既然开发环境和部署环境的区别比较大,我们总希望在开发调试的时候,能更加贴近实际的部署环境。所以今天这篇文章说一下如何调试部署在docker的asp.net core app。

如果大家有安装VS2017,这个其实是最好的,调试和部署都是点选几个按钮,然后就可以愉快地调试了。

但总有一些情况下无法安装VS2017的,所以下文讲的是利用VS code调试。

开发机器必要的环境:

1. .net core 1.1

2. vs code (尽量最新版)

3. docker 17.06.0‘

项目结构

我们使用dotnet cli先把项目建起来,进入到要用的目录,跑下面几个命令,

dotnet new mvc -n web
dotnet new sln mytest
dotnet sln mytest.sln add web/web.csproj

好了,项目建好之后,我们用vs打开,等待一下,vscode就会自动帮我们建立一个.vscode的文件夹,里面会有一些调试配置文件,如下图:

打开program.cs文件,修改一下Main方法的代码,主要是要修改的是端口,为了避免跟别的端口冲突

public static void Main(string[] args)
{
     var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseUrls("http://*:6106")
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();

    host.Run();
}

项目基本是完整的,但是还要配Dockerfile,主要是推到docker的配置文件

我们在web目录下新建一个Dockerfile,内容如下:   (注意:这个文件是没有后缀的)

 1 FROM microsoft/dotnet:latest
 2
 3 RUN apt-get update
 4
 5 RUN apt-get install curl unzip -y
 6
 7 RUN curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbg
 8
 9 RUN chmod 777 /root/vsdbg
10
11 COPY ./publish /app
12
13 WORKDIR /app
14
15 ENTRYPOINT ["dotnet", "web.dll"]

简单解释一下上面的配置,

第1行的意思是基于microsoft/dotnet的最新版本镜像。

第3、5行是更新apt-get和安装curl,unzip这2个工具(其中最后一个  -y 是必须的,否则docker会在那里等待命令输入,最终会导致调试失败)

第7、9行就是curl安装 vsdebuger了,并且把这个安装目录调了权限

11行是把开发环境下的publish目录下的内容复制到docker镜像中的/app目录下

13行是指定docker工作目录是/app

15行是运行的入口,翻译过来的就是 dotnet web.dll (有点像本地部署后的运行)

部署到docker

我们首先要把.net core app发布一下,注意一定要选定Debug模式,后面指定的发布路径也要指定,否则dockerfile的第11行就要修改了

dotnet publish -c Debug -o ./publish

跑完之后web目录下就会多了publish目录,下面有很多dotnet的发布文件(今天先不讲最小量发布,东西多了点也没有关系)

从docker下载镜像microsoft/dotnet:lastest , 并且制作自己的镜像myimage1

docker pull microsoft/dotnet
docker image tag microsoft/dotnet:latest myimage1:latest

之后我们就要把.net core 的东西发布到docker了 。 最后的一个点"."是必须的!!!

docker build -t myimage1 --rm .

部署的过程取决于你的网络,因为要装好几个东西,其中vsdebuger是相当慢的,不过也是可以解决的,我们在文章结束后再讨论解决办法

当docker build完成之后,我们就让app在容器中跑起来

docker run -t -p 6106:6106 --name mytestcontainer myimage1

其中-p 6106:6106指的是把本机的6106端口指向容器中6106端口,其实这里是可以不一一对应的。

--name mytestcontainer 是指把这个myimage1镜像,用mytestcontainer这个名称来运行容器。好处是之后我们队容器的操作只要记住这个名称就可以了,不用记着docker自动给我们生成的id。

好这样.net core app就在容器中跑起来了,我们打开localhost:6106,其实就能看到效果啦

vs code 调试配置

打开.vscode/launch.json文件。点击右下角的Add configuration我们去添加一个调试配置。

之后vscode会自动提示要选哪一些调试配置,我们直接选  .Net: Attach to remote .NET Core Console App(也就是第二个。。。),如图

点击之后,就会生成下面的配置,里面有很多东西都要改的。里面也有一些提示,比如debuggerPath就是输入debugger在目标电脑的位置这些

最终我们要把configuration节点下的内容改成下面这样

 1      {
 2             "name": ".NET Core Attach",
 3             "type": "coreclr",
 4             "request": "attach",
 5             "processId": "${command:pickRemoteProcess}",
 6             "pipeTransport": {
 7                 "pipeCwd": "${workspaceRoot}",
 8                 "pipeProgram": "bash",
 9                 "pipeArgs": [
10                     "-c",
11                     "docker exec -i mytestcontainer ${debuggerCommand}"
12                 ],
13                 "debuggerPath": "/root/vsdbg/vsdbg"
14             },
15             "sourceFileMap": {
16                 "/Users/admin/my/github/test_debug_docker": "${workspaceRoot}"
17             }
18         }        

其中第11行中的 -i mytestcontainer是我们前面指定的容器的名称,这里也可以用id代替

13行中的debuggerPath就是刚才curl下载安装的vsdbg,这里要留意docker build的时候vsdbg安装的目录在哪里

16行的sourceFileMap是指这整个项目在你开发环境的位置,简单点来说就是vscode你打开的是那个目录(这个其实意义比较深,这里不展开讨论)

好,一切准备就绪了,调试起来吧!!

调试效果

按F5,然后会让你选择哪一个进程进行调试,当然选择dotnet web.dll这个

等一些时间,然后就可以了,然后我们在homecontroller.cs这个文件的About方法设一个断点

然后打开这个链接:http://localhost:6106/Home/About,就可以看到下图的端点已经进去了。

然后在左边的变量中就能看到他的值了,跟左边跑的是一样的

我们也可以在debug console中修改他的值,比如输入成ViewData["Message"] = "test test";可以看到左边的变量已经变了

页面的内容也变成test test了

总结

以往我们在vs中调试mvc页面,我们改了cshtml的内容,保存后刷新页面,就能够立即看到变化效果,但是在vs code却不能。估计是因为docker的原因,之后应该是可以解决的。

另外的一个缺点是,附加到进程始终是有缺点的,他无法同时附加多个进程,如果要多个系统间调试,只能同时启动多个vs code,这个对比vs的调试来说差别太大了。因为系统既然想部署在docker,估计都是模块化甚至是微服务单元,这样一个比较完整的系统,肯定设计多个子模块间的调试。虽然每个模块可能不是同一个人做,开发环境下能连着调试不是更加好吗。

解决vsdebugger下载超级慢的办法

其实vsdebugger的安装,只是把文件下载下来,然后放在指定的目录。

所以解决办法就是把这个vsdebugger下载下来,然后解压,放到开发环境下的web目录下,最后用Dockerfile配置,把vsdbg拷贝过去容器,下面是修改后的Dockerfile

FROM microsoft/dotnet:latest

RUN apt-get update

RUN apt-get install curl unzip -y

# RUN curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbg

COPY ./vsdbg /root/vsdbg

RUN chmod 777 /root/vsdbg

COPY ./publish /app

WORKDIR /app

ENTRYPOINT ["dotnet", "web.dll"]

这样就不用等待curl安装vsdebugger了。

vsdebugger 的下载链接:

https://vsdebugger.azureedge.net/vsdbg-15-1-10630-1/vsdbg-linux-x64.zip

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo }
span.s1 { }

时间: 2024-12-20 17:40:19

VS code docker 调试 asp.net core的相关文章

VS Code开发调试ASP.NET Core 1.0

VS Code开发调试ASP.NET Core 1.0 使用VS Code开发调试ASP.NET Core 1.0,微软在今天凌晨发布了.NET Core 1.0,ASP.NET Core 1.0 与 Entity Framewok 1.0. 之前跟大家讲解过VS Code开发调试.NET Core RC2应用程序.今天讲一下VS Code开发 ASP.NET Core. 环境安装 .NET Core SDK Installer: win x64: https://download.micros

使用VS Code开发调试ASP.NET Core 1.0

使用VS Code开发调试ASP.NET Core 1.0,微软在今天凌晨发布了.NET Core 1.0,ASP.NET Core 1.0 与 Entity Framewok 1.0. 之前跟大家讲解过VS Code开发调试.NET Core RC2应用程序.今天讲一下VS Code开发 ASP.NET Core. 环境安装 .NET Core SDK Installer: win x64: https://download.microsoft.com/download/A/3/8/A3848

Visual Studio Code和Docker开发asp.net core和mysql应用

Visual Studio Code和Docker开发asp.net core和mysql应用 .net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对岸的苹果园越来越茂盛,实在不想再去做一只宅猿了.于是,.net猿决定搭上小鲸鱼的渡轮到苹果园去看看. .net猿上了小鲸鱼渡轮就先问了一个问题,苹果园上有能用来编写c#代码的和Visual Studio一样强大的IDE么?这时,天空闪过一道Gamma射线,艾瑞克神说,给你一个 Visual Stud

Visual Studio 2017中使用SourceLink调试ASP.NET Core源码

背景 当我们在学习ASP.NET Core或者调试ASP.NET Core程序的时候,有时候需要调试底层代码,但是当我们在Visual Studio中调试程序的时候,由于一些基础库或者第三方库缺少pdb文件,所以调试这些库的代码的时候,会出现断点不能进去的情况. 例如,在如下代码中,我们希望调试一下View()方法,看看其中的内部实现 但是当我们点击F11之后,程序会直接跳到下一步 Source Link SourceLink是一组用于描述可嵌入到符号.二进制文件和包中的源代码控制元数据的包和规

Docker打包 Asp.Net Core应用,在CentOS上运行

本文主要介绍下运用docker虚拟技术打包Asp.net core应用. Docker作为一个开源的应用容器引擎,近几年得到广泛的应用,使用Docker我们可以轻松实现应用的持续集成部署,一次打包,到处运行. 开篇借用百科上对docker的介绍. Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 方便大家学习: http://www.doc

使用Docker部署ASP.NET Core应用程序实践

前言 最近把很火的Docker给看了,于是就磨拳擦掌要去实践一下.于是就拿之前一个aps.net core的项目(已被停止)去练手.该项目之前在ubuntu14.04上确保可以正常运行,所以docker化应该不会有太多问题.搜索了下微软提供了asp.net core的官方docker镜像,但我为了学习docker决定从linux的基础镜像开始制作docker镜像,同时为了少绕弯路,决定从确保能运行的ubuntu14.04开始. 准备 环境 OS:Ubuntu 14.04 .NET Core SD

Centos7 &amp; Docker &amp; Jenkins &amp; ASP.NET Core 2.0 自动化发布和部署

写在前面 Docker一直很火热,一直想把原本的Jenkins自动部署工具搬到Docker上面,无奈今年一直忙于各种事情,迟迟未实施这个事情,正好迎来了dotnet core 2.0 的正式发布,升级项目的同时,顺便直接将Jenkins搬到Docker上.为什么要写这篇文章呢?因为找过相关的资料,大多数文章都是基于Ubuntu 安装.net core 又或者 GitLab 进行持续集成 自动部署等等等,并未有人尝试过Centos7.3 上部署 Jenkins 并且 构建 ASP.NET CORE

使用docker部署Asp.net core web应用程序--图文教程

要想参考本文做实验,可以参考上一篇文章,关于docker的简单操作,写的比较详细. 拉取aspnetcore最新docker镜像 从阿里云的docker镜像拉取,因为前面我们针对docker镜像做过配置. [[email protected] ~]# docker pull microsoft/aspnetcore 根据你的网速等待拉取成功. [[email protected] ~]# docker images 执行上面的命令,如果能看到aspnetcore镜像,则表示拉取成功. 如果我们想

Centos下使用Docker部署asp.net core项目

本文讲述 CentOS 系统 Docker 中部署 asp.net core开源项目 abp 的过程 步骤 1. 拉取 asp.net core 基础镜像 docker pull microsoft/aspnetcore 2.编写 Dockerfile 文件 FROM docker.io/microsoft/aspnetcore WORKDIR /app COPY . . ENTRYPOINT ["dotnet", "QXD.BBS.Web.Mvc.dll"] 3.