三、使用vscode在docker中debug


上篇博文中分享了如何用docker-compose搭建AspNetCore的開發環境,在開發過程中debug是必不可少的,如果你使用VS2017的話,右鍵就可以了,而作為跨平台的.net core開發的時候卻要依賴VisualStudio,那一定算不上真正的跨平台,而且不是所有人都能買得起VS的許可證,買得起windows的授權,(我知道很多人都沒買過:)所以這次來分享一下如何使用vscode在docker中debug。

我們知道vscode是可以遠程debug的,參考OminiSharp的Wiki,其原理就是在服務器上安裝.NetCore命令行調試工具VSDBG,然后本地vscode通過ssh隧道建立和服務器之間的連接,控制服務器上的VSDBG進行斷點調試。

根據遠程debug的啟發,我們可以在docker中安裝VSDBG,vscode訪問容器中的VSDBG進行斷點調試,原理和上面的遠程debug一樣,區別在於可以直接訪問容器而不需要ssh。

首先通過命令

curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbg

記得2個月之前用這個命令無法安裝的VSDBG,因為里面的工具包下載不了,只能手動把對應版本的工具包下載下來,然后上傳到自己的文件服務器,再替換腳本中的下載地址,折騰的好煩人。現在可以直接下載了,非常開心😄。

在容器中安裝VSDBG,具體的Dockerfile如下:

FROM microsoft/aspnetcore:1.1.1

ENV TZ=Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \

    && apt-get update \

    && yes | apt-get install curl unzip \

    && curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbg

WORKDIR /app

VOLUME /app

ENV ASPNETCORE_ENVIRONMENT Development

ENTRYPOINT ["dotnet", "Web.dll"]

最近.net core 2.0 發布了,這里的需要做一些更新,如下:

FROM microsoft/aspnetcore:2.0 /*更新到2.0的鏡像*/

LABEL Name=aspnetcore-debug Version=latest

ENV TZ=Asia/Shanghai

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \

    && apt-get update \

    && apt-get install -y curl unzip \

    && apt-get install -y procps \     /*最新的鏡像中沒有ps,所以需要安裝*/

    && curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbg
    
WORKDIR /app

VOLUME /app

在vscode中項目根目錄下的.vscode文件夾中的lunch.jsonconfigurations節點中追加一個debug配置:

{
    "name": ".NET Core Remote Attach",
    "type": "coreclr",
    "request": "attach",
    "processId": "${command:pickRemoteProcess}",
    "pipeTransport": {
        "pipeProgram": "bash",
        "pipeArgs": [
            "-c",
            "docker exec -i 你的容器名稱 ${debuggerCommand}"
        ],
        "debuggerPath": "/root/vsdbg/vsdbg",
        "pipeCwd": "${workspaceRoot}",
        "quoteArgs": true
    },
    "sourceFileMap": {
        "/app": "${workspaceRoot}"
    },
    "justMyCode": true
}

主機是通過docker exec -i 你的容器名稱 ${debuggerCommand}命令和容器進行交互的,不了解docker exec的可以去查看一下文檔。

 "sourceFileMap": {
        "/app": "${workspaceRoot}"
    },

sourceFileMap映射容器中程序所在的路徑,這里就是之前Dockerfile中的WORKDIR的路徑。

那么現在咱們dotnet publish -c Debug src/Web/Web.csproj發布這個項目,然后Build容器, docker build -t myweb,接着docker run -t -name MyDebugWeb myweb,現在容器已經運行了,在vscode中的Deubg中選擇剛才新建的.NET Core Remote Attach

F5進入Debug模式,在程序中設置一個斷點,當程序運行到這里的時候就變黃了,

和VisualStudio一摸一樣。

當然也可以不用單獨build這個容器,直接放在之前講的docker-compose中,效果也是一樣的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM