本文主要介紹通過Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器環境下,對ASP.NET Core Web API應用程序進行調試。在自己做實驗的過程中也碰到了一些問題,經過一些測試和搜索資料,基本解決了這些問題,本文也會對這些問題進行介紹,以免有相同需求的朋友多走彎路。
插件的下載與安裝
至撰寫本文為止,Visual Studio 2015 Tools for Docker插件還是處於Preview的版本(版本號:0.31.0),可以點擊此處下載。要正確安裝此插件並能夠成功地在Visual Studio 2015中使用該插件進行調試,需要滿足以下先決條件:
- Microsoft Visual Studio 2015 Update 3
- Enterprise
- Professional
- Community
- Microsoft .NET Core 1.0 SDK for Windows以及VS 2015 Tooling Preview 2
- Windows系統已經安裝Docker for Windows或者Docker Toolbox
本文將以VS 2015 Enterprise + Windows 10 + Docker for Windows作為開發環境進行介紹。
下載插件后,即可按照正常的軟件安裝過程進行安裝。安裝過程請退出Visual Studio 2015。安裝成功后,可以在Visual Studio的“擴展與更新”中找到Visual Studio 2015 Tools for Docker – Preview:
在ASP.NET Core Web API項目上啟用Docker的支持
打開我們的DockerWebAPI項目,在項目上單擊鼠標右鍵,然后選擇“添加 –> Docker Support” 菜單:
經過一段時間,VS Tools for Docker就會在項目上添加一些文件:
我們暫時先不詳細介紹這些文件的具體內容和作用。基本上在Properties目錄下是給Visual Studio 2015和編譯環境所使用的;而docker-compose以及Dockerfile都是給Docker所使用的,需要了解詳細信息的朋友,可以先上網搜索了解一下。
開始調試ASP.NET Core Web API應用程序
在開始調試以前,請首先打開Docker for Windows的設置,在Shared Drivers里,把項目所在的驅動器勾選上。如果這步沒有做,那么就無法成功啟動調試器。
接下來,直接按下F5快捷鍵,就可以開始調試了。當然,也可以按下工具欄上的“啟動”按鈕來啟動調試,可以看到,我們的調試按鈕已經默認設置為Docker了:
Visual Studio 2015啟動Debugger的過程大致如下:
- 調用PowerShell腳本DockerTask.ps1,對環境進行清理,比如停止正在運行的容器,以及將已有的Docker Image刪除
- Visual Studio對項目進行編譯
- 調用PowerShell腳本DockerTask.ps1,將項目發布到bin/Docker/Debug/app目錄
- 開始根據docker-compose.debug.yml的文件內容,生成Docker Image
- 啟動Visual Studio Debugger,通過不斷地ping http://localhost/api/values 端點,確保Docker Container已經成功加載
- 打開默認瀏覽器,開始調試,等待斷點命中
需要注意的是,VS Tools for Docker默認使用80端口,如果系統中已經安裝有使用80端口的服務,比如IIS,請要么停止占用80端口的服務,要么修改項目中的yml文件,選擇使用其它的端口。否則編譯過程將無法完成。另一個需要注意的地方是,由於在上一次的案例中,我們通過UseUrls API指定了我們的應用程序可以接受來自任何地址的5000端口的請求,因此,我們也需要相應地修改docker-compose.debug.yml文件,使其能夠將主機的80端口映射到5000端口,如下:
成功啟動調試器之后,即可設置斷點,待斷點命中時,可以像調試普通C#應用程序那樣,使用Visual Studio提供的各種調試體驗。從下圖可以看出,我們的調試上下文已經是在Docker容器中了(Environment.MachineName返回了Docker Container的ID):
有關自動生成的Docker Image
在Visual Studio Tools for Docker完成項目的編譯之后,會生成一個名稱為“username/xxxx: Debug”的Docker Image(xxxx為項目名稱):
既然是一個Docker Image,那么我們應該可以使用docker run命令,在容器中執行這個Docker Image。現在我們來嘗試一下:
發現並沒有執行成功,提示了一個bash的錯誤:integer expression expected。此時也無法從瀏覽器訪問這個應用程序。經過一段時間的研究,發現在Dockerfile.debug文件的最后一條ENTRYPOINT指令處,將:
ENTRYPOINT ["/bin/bash", "-c", "if [ \"$REMOTE_DEBUGGING\" -eq 0 ]; then dotnet DockerWebAPI.dll; else sleep infinity; fi"]
改為:
ENTRYPOINT ["/bin/bash", "-c", "if [[ \"$REMOTE_DEBUGGING\" -eq 0 ]]; then dotnet DockerWebAPI.dll; else sleep infinity; fi"]
(if后面的子句使用兩個雙括號)。
此時再次編譯運行,調試過程也不會有什么問題,再次通過命令行執行新生成的Docker Image,可以看到,這個錯誤已經修復:
其實這只是我在使用VS Tools for Docker的一個小發現,並沒有太大的實際意義:
- 在Debug模式,如果不修復這個問題,Debugger照樣可以啟動
- 在Release模式,Dockerfile根本就沒有這條指令(因為Release模式下只需要正常啟動應用程序就可以了)
反正在此也把這個心得分享出來,或許也能幫到有着同樣疑惑的朋友。
總結
本文對Visual Studio Tools for Docker進行了簡單的介紹。在后續的文章中,我還會繼續介紹一些Docker的使用心得,並同時介紹一些ASP.NET Core Web API的開發經驗。