前言

.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的更多相关文章

  1. 使用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. 之前跟大家讲 ...

  2. 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 与 ...

  3. 使用Docker调试Asp.Net Core

    使用 Docker 进行部署 目前还是使用将发布出来的文件打包进docker镜像的形式 $ docker build -t pims . $ docker run --name pims --rm - ...

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

    Visual Studio Code和Docker开发asp.net core和mysql应用 .net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对 ...

  5. 调试 ASP.NET Core 2.0 源代码

    在Visual Studio 2017中可以通过符号以及源链接,非常方便对 ASP.NET Core 2.0中源代码进行调试.在这篇文章中,我们将重点介绍如何使用源链接对ASP.NET Core源进行 ...

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

    背景 当我们在学习ASP.NET Core或者调试ASP.NET Core程序的时候,有时候需要调试底层代码,但是当我们在Visual Studio中调试程序的时候,由于一些基础库或者第三方库缺少pd ...

  7. Docker和ASP.NET Core

    Docker和ASP.NET Core Docker 正在逐渐成为容器行业的事实标准,受到 Windows 和 Linux 生态系统领域最重要供应商的支持. (Microsoft 是支持 Docker ...

  8. IIS调试ASP.NET Core项目

    IIS调试ASP.NET Core项目 新建一个ASP.NET Core Web项目,选择API模板或随便一个模板都行 新建一个名为localhost的发布(没试过远程主机,或许也可以),主要设置如下 ...

  9. Docker的asp.net core应用部署系列——docker pull 加速

    原文:Docker的asp.net core应用部署系列--docker pull 加速 版权声明:本文为博主原创文章,随意转载. https://blog.csdn.net/Michel4Liu/a ...

随机推荐

  1. hadoop文件IO

    InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符.它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集. Input ...

  2. 学习动态性能表(3)--v$sql&v$sql_plan

    学习动态性能表 第三篇-(1)-v$sq 2007.5.25 V$SQL中存储具体的SQL语句. 一条语句可以映射多个cursor,因为对象所指的cursor可以有不同用户(如例1).如果有多个cur ...

  3. 两种方式创建Maven项目【方式二】

    1.不勾选Create a simple project,直接点击下一步 2.选择maven-archetype-webapp下一步 3.填写相关信息,点击下一步完成 4.此时会报一个jsp的错误.我 ...

  4. 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 ...

  5. 搭建基于hyperledger fabric的联盟社区(一) --前言

    三个月前上面发了一个关于智群汇聚和问题求解研究的项目,我们公司做其中的一个子项目,就是基于区块链的科技信息联盟构建.利用区块链的去中心化特性,构建一个基于区块链的科技社区,以提供科技群智汇聚采集的基础 ...

  6. Rest之路 - Rest架构中的重要概念(二)

    状态无关性 Rest 架构中不维持client,resource and request 的状态,我们通常称 Rest 服务是状态无关的.基于此的优势是为设计Rest架构提供了简便:每一个请求可以被完 ...

  7. linux那点事儿(七)----文件系统管理

    如果你是一位忠实的windows 用户,那么现在请你打开的的c盘,打开WINDWOS目录,下面存放了哪些文件和目录,相信没有人关心过吧!即便是用windows多年的人.额!其实,我也知道WINDOWS ...

  8. Populating Next Right Pointers in Each Node II ?

    void connect(TreeLinkNode *root) { if(root==NULL) return; if(root->left&&root->right) ...

  9. .gitignore non-valiate

    Git忽略规则及.gitignore规则不生效的解决办法 分享到:更多19 2015-02-12    分类:Share2人评论65,215 次人浏览 在git中如果想忽略掉某个文件,不让这个文件提交 ...

  10. 决策树 ID3 C4.5 CART(未完)

    1.决策树 :监督学习 决策树是一种依托决策而建立起来的一种树. 在机器学习中,决策树是一种预测模型,代表的是一种对象属性与对象值之间的一种映射关系,每一个节点代表某个对象,树中的每一个分叉路径代表某 ...