VS code docker 調試 asp.net core

來源:互聯網
上載者:User

標籤:contain   linu   .json   user   chm   效果   應該   如何   最小   

前言

.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 webdotnet new sln mytestdotnet 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/vsdbg10 11 COPY ./publish /app12 13 WORKDIR /app14 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/dotnetdocker 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:latestRUN apt-get updateRUN apt-get install curl unzip -y# RUN curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbgCOPY ./vsdbg /root/vsdbgRUN chmod 777 /root/vsdbgCOPY ./publish /appWORKDIR /appENTRYPOINT ["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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.