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,内容如下: (注意:这个文件是没有后缀的)
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 RUN chmod /root/vsdbg COPY ./publish /app WORKDIR /app 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 : --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节点下的内容改成下面这样
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach",
"processId": "${command:pickRemoteProcess}",
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "bash",
"pipeArgs": [
"-c",
"docker exec -i mytestcontainer ${debuggerCommand}"
],
"debuggerPath": "/root/vsdbg/vsdbg"
},
"sourceFileMap": {
"/Users/admin/my/github/test_debug_docker": "${workspaceRoot}"
}
}
其中第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 /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
VS code docker 调试 asp.net core的更多相关文章
- 使用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开发调试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 与 ...
- 使用Docker调试Asp.Net Core
使用 Docker 进行部署 目前还是使用将发布出来的文件打包进docker镜像的形式 $ docker build -t pims . $ docker run --name pims --rm - ...
- Visual Studio Code和Docker开发asp.net core和mysql应用
Visual Studio Code和Docker开发asp.net core和mysql应用 .net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对 ...
- 调试 ASP.NET Core 2.0 源代码
在Visual Studio 2017中可以通过符号以及源链接,非常方便对 ASP.NET Core 2.0中源代码进行调试.在这篇文章中,我们将重点介绍如何使用源链接对ASP.NET Core源进行 ...
- Visual Studio 2017中使用SourceLink调试ASP.NET Core源码
背景 当我们在学习ASP.NET Core或者调试ASP.NET Core程序的时候,有时候需要调试底层代码,但是当我们在Visual Studio中调试程序的时候,由于一些基础库或者第三方库缺少pd ...
- Docker和ASP.NET Core
Docker和ASP.NET Core Docker 正在逐渐成为容器行业的事实标准,受到 Windows 和 Linux 生态系统领域最重要供应商的支持. (Microsoft 是支持 Docker ...
- IIS调试ASP.NET Core项目
IIS调试ASP.NET Core项目 新建一个ASP.NET Core Web项目,选择API模板或随便一个模板都行 新建一个名为localhost的发布(没试过远程主机,或许也可以),主要设置如下 ...
- Docker的asp.net core应用部署系列——docker pull 加速
原文:Docker的asp.net core应用部署系列--docker pull 加速 版权声明:本文为博主原创文章,随意转载. https://blog.csdn.net/Michel4Liu/a ...
随机推荐
- hadoop文件IO
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符.它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集. Input ...
- 学习动态性能表(3)--v$sql&v$sql_plan
学习动态性能表 第三篇-(1)-v$sq 2007.5.25 V$SQL中存储具体的SQL语句. 一条语句可以映射多个cursor,因为对象所指的cursor可以有不同用户(如例1).如果有多个cur ...
- 两种方式创建Maven项目【方式二】
1.不勾选Create a simple project,直接点击下一步 2.选择maven-archetype-webapp下一步 3.填写相关信息,点击下一步完成 4.此时会报一个jsp的错误.我 ...
- bzoj 1119 [POI2009]SLO && bzoj 1697 [Usaco2007 Feb]Cow Sorting牛排序——思路(置换)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1119 https://www.lydsy.com/JudgeOnline/problem.p ...
- 搭建基于hyperledger fabric的联盟社区(一) --前言
三个月前上面发了一个关于智群汇聚和问题求解研究的项目,我们公司做其中的一个子项目,就是基于区块链的科技信息联盟构建.利用区块链的去中心化特性,构建一个基于区块链的科技社区,以提供科技群智汇聚采集的基础 ...
- Rest之路 - Rest架构中的重要概念(二)
状态无关性 Rest 架构中不维持client,resource and request 的状态,我们通常称 Rest 服务是状态无关的.基于此的优势是为设计Rest架构提供了简便:每一个请求可以被完 ...
- linux那点事儿(七)----文件系统管理
如果你是一位忠实的windows 用户,那么现在请你打开的的c盘,打开WINDWOS目录,下面存放了哪些文件和目录,相信没有人关心过吧!即便是用windows多年的人.额!其实,我也知道WINDOWS ...
- Populating Next Right Pointers in Each Node II ?
void connect(TreeLinkNode *root) { if(root==NULL) return; if(root->left&&root->right) ...
- .gitignore non-valiate
Git忽略规则及.gitignore规则不生效的解决办法 分享到:更多19 2015-02-12 分类:Share2人评论65,215 次人浏览 在git中如果想忽略掉某个文件,不让这个文件提交 ...
- 决策树 ID3 C4.5 CART(未完)
1.决策树 :监督学习 决策树是一种依托决策而建立起来的一种树. 在机器学习中,决策树是一种预测模型,代表的是一种对象属性与对象值之间的一种映射关系,每一个节点代表某个对象,树中的每一个分叉路径代表某 ...