前言

.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. FastAdmin CMS 插件相关文章收集(2018-08-16)

    FastAdmin CMS 插件相关文章收集(2018-08-16) CMS内容管理系统(含小程序) 介绍 https://www.fastadmin.net/store/cms.html CMS内容 ...

  2. ORA-00845 : MEMORY_TARGET not supported on this system(调大数据库内存无法启动)

    问题描述:调大数据库内存后,启动数据库报 ORA-00845 : MEMORY_TARGET not supported on this system . -- 调大数据库内存后,数据库启动报错[ro ...

  3. 64位windows下mysql安装

    登入mysql官网https://www.mysql.com/downloads/,点击Community,选择MySQL on Windows,选择MySQL Installer,选择MySQL S ...

  4. 事务之四:Spring事务--原理

    一.Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: ...

  5. window.open()打开新窗口被拦截

    window.open( url )是常用的打开新页面的方法,一般都没有问题,但是如果在ajax回调方法里面使用就会被浏览器拦截,因为在浏览器安全机制中,页面弹窗必须是由用户触发的才是安全弹窗,比如说 ...

  6. Oracle 利用执行计划来避免排序操作

    在oracle中,利用index来避免排序 SQL) NOT NULL); SQL> CREATE INDEX IND_T_NOSORT_NAME ON T_NOSORT(NAME); SQL& ...

  7. MySQL 优化器

    (system@127.0.0.1:3306) [trunk]> show variables like '%performance_sch%';+----------------------- ...

  8. maven(基础介绍一)

    maven:提供的作用有以下几点: 1 jar包依赖 这个也许会maven最突出的特点了使用maven不需要上网单独下载jar包,只需要在配置文件pom.xml中配置jar包的依赖关系,就可以自动的下 ...

  9. spring+hibernate ---含AOP--事务--laobai

    biz包: package com.etc.biz; import java.util.List; import org.springframework.orm.hibernate3.support. ...

  10. Flask之测试与部署

    5.1 蓝图Blueprint 为什么学习蓝图? 我们学习Flask框架,是从写单个文件,执行hello world开始的.我们在这单个文件中可以定义路由.视图函数.定义模型等等.但这显然存在一个问题 ...