前言

.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. TCP报文送达确认ACK

    TCP数据包中的序列号(Sequence Number)不是以报文段来进行编号的,而是将连接生存周期内传输的所有数据当作一个字节流,序列号就是整个字节流中每个字节的编号.一个TCP数据包中包含多个字节 ...

  2. FPGA论剑

    今天走在街上,听到了久违的<光辉岁月>,想起6月30号那天,街边所有的餐厅.小店都在播放beyond的经典之作,那天是香港殿堂级乐队beyond乐队主唱兼吉他手黄家驹先生的忌日.黄家驹先生 ...

  3. 好用的一个object c 宏

    好用的一个object c 宏 from https://github.com/justzt/ios-helper/blob/master/Macro.h // // Macro.h // Photo ...

  4. keytool生成JKS证书的详细步骤及截图

    注:防止有不必要的空格,尽量不要复制粘贴 1. 依据CFCA所提供的CN生成密钥存储文件和密钥对(创建JKS证书库) keytool -genkey -v -alias slserver -keyal ...

  5. 使用wireshark观察SSL/TLS握手过程--双向认证/单向认证

    SSL/TLS握手过程可以分成两种类型: 1)SSL/TLS 双向认证,就是双方都会互相认证,也就是两者之间将会交换证书.2)SSL/TLS 单向认证,客户端会认证服务器端身份,而服务器端不会去对客户 ...

  6. 分布式缓存系统 Memcached slab和item的主要操作

    上节在分析slab内存管理机制时分析Memcached整个Item存储系统的初始化过程slabs_init()函数:分配slabclass数组空间,到最后将各slab划分为各种级别大小的空闲item并 ...

  7. Ceph recover的速度控制

    前言 磁盘损坏对于一个大集群来说,可以说是必然发生的事情,即使再小的概率,磁盘量上去,总会坏那么几块盘,这个时候就会触发内部的修复过程,修复就是让不满足副本要求的PG,恢复到满足的情况 一般是踢掉坏盘 ...

  8. js操作一般文件和csv文件

    js操作一般文件和csv文件 将文本文件读成字符串 <input type="file" id="upload"> document.getElem ...

  9. java成神之——enum枚举操作

    枚举 声明 枚举遍历 枚举在switch中使用 枚举比较 枚举静态构造方法 使用类来模拟枚举 枚举中定义抽象方法 枚举实现接口 单例模式 使用静态代码快 EnumSet EnumMap 结语 枚举 声 ...

  10. C#通用模块专题

    开源 程序设计 常用组件 加载图片,播放音乐.视频,摄像头拍照 文件读写(txt.xml.自定义文件格式(后缀名)) 串口通信 稳定的串口读写:http://blog.csdn.net/kolvin2 ...