溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何創(chuàng)建一個帶診斷工具的.NET鏡像

發(fā)布時間:2022-07-30 14:17:16 來源:億速云 閱讀:93 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下如何創(chuàng)建一個帶診斷工具的.NET鏡像的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

現(xiàn)階段的問題

現(xiàn)在是云原生和容器化時代,.NET Core對于云原生來說有非常好的兼容和親和性,dotnet社區(qū)以及微軟為.NET Core提供了非常方便的鏡像容器化方案。所以現(xiàn)在大多數(shù)的dotnet程序都是部署在各種容器化環(huán)境中,比如我們常見的Docker。

微軟官方為.NET提供的許多Docker鏡像,讓我們可以很方便的創(chuàng)建容器化的.NET應(yīng)用。如下所示就是部分官方提供的不同操作系統(tǒng)的鏡像。

如何創(chuàng)建一個帶診斷工具的.NET鏡像

其它更詳細(xì)的內(nèi)容大家可以點擊后面的網(wǎng)址查看:https://hub.docker.com/_/microsoft-dotnet-runtime/

使用VS新建一個項目,微軟官方給出的多段構(gòu)建Dockerfile如下所示:

# 使用aspnet runtime鏡像作為基礎(chǔ)鏡像
FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal AS base
WORKDIR /app
EXPOSE 80

# 使用sdk鏡像進(jìn)行編譯 
FROM mcr.microsoft.com/dotnet/sdk:6.0-focal AS build
WORKDIR /src
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . .
WORKDIR "/src/WebApplication1"
RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build

# 使用build鏡像發(fā)布
FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish

# 拷貝編譯結(jié)果到base鏡像,完成鏡像打包
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

現(xiàn)在看起來一切都很美好,但是假設(shè)我們遇到某一些線上CPU 100%、內(nèi)存占用率很高或者程序突然停止響應(yīng)等問題我們需要使用dotnet-trace、dotnet-dump等工具時就會發(fā)現(xiàn)使用不了。

如何創(chuàng)建一個帶診斷工具的.NET鏡像

而且在沒有安裝.NET SDK的情況下,我們也無法安裝dotnet tool。

如何創(chuàng)建一個帶診斷工具的.NET鏡像

解決方案

1.直接使用命令安裝dotnet sdk,然后再安裝dotnet tool,微軟在官網(wǎng)給出的非常方便的安裝方案,但是這不是我們想要的,畢竟每次還得下載多麻煩。

如何創(chuàng)建一個帶診斷工具的.NET鏡像

2.構(gòu)建最終鏡像使用sdk鏡像,這樣的話我們就可以直接安裝好這些工具,這也不是我們想要的,因為sdk鏡像太大了,不利于我們分發(fā)和下載(自建機房的鈔能力除外)。

如何創(chuàng)建一個帶診斷工具的.NET鏡像

3.就是我們今天提到的方案,我們可以利用Docker多段構(gòu)建,使用sdk鏡像安裝好dotnet tool以后,直接COPY到我們runtime的鏡像,然后在runtime的鏡像中使用。

# 使用aspnet runtime鏡像作為基礎(chǔ)鏡像
FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal AS base
WORKDIR /app
EXPOSE 80

# 使用sdk鏡像進(jìn)行編譯 
FROM mcr.microsoft.com/dotnet/sdk:6.0-focal AS build
WORKDIR /src
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . .
WORKDIR "/src/WebApplication1"
RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build
# !!! 在build鏡像安裝dotnet tools
RUN dotnet tool install -g dotnet-dump \
    && dotnet tool install -g dotnet-trace

# 使用build鏡像發(fā)布
FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish

# 拷貝編譯結(jié)果到base鏡像,完成鏡像打包
FROM base AS final
WORKDIR /app

# !!! 從build鏡像中把dotnet工具COPY出來 并設(shè)置為PATH
COPY --from=build /root/.dotnet/tools /root/.dotnet/tools
ENV PATH="$PATH:/root/.dotnet/tools"

COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

其中關(guān)鍵就是這兩步,在build中使用dotnet tool來安裝好所需要的工具,然后復(fù)制到runtime鏡像中。

...
# !!! 在build鏡像安裝dotnet tools
RUN dotnet tool install -g dotnet-dump \
    && dotnet tool install -g dotnet-trace
...
# !!! 從build鏡像中把dotnet工具COPY出來 并設(shè)置為PATH
COPY --from=build /root/.dotnet/tools /root/.dotnet/tools
ENV PATH="$PATH:/root/.dotnet/tools"

當(dāng)然我們可以打包一個包含好工具的runtime,供后面使用,就不用每次都安裝tool了。我個人比較喜歡使用Ubuntu作為基礎(chǔ)鏡像,大家也可以用Alpine之類的基礎(chǔ)鏡像來進(jìn)一步縮小體積。

# 使用sdk鏡像進(jìn)行編譯 
FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build

# !!! 在build鏡像安裝dotnet tools
RUN dotnet tool install -g dotnet-dump \
    && dotnet tool install -g dotnet-trace

# 使用aspnet runtime鏡像作為基礎(chǔ)鏡像
FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine AS base
WORKDIR /app

# !!! 從build鏡像中把dotnet工具COPY出來 并設(shè)置為PATH
COPY --from=build /root/.dotnet/tools /root/.dotnet/tools
ENV PATH="$PATH:/root/.dotnet/tools"

最終鏡像也很小,當(dāng)然我們可以使用單文件發(fā)布和Native AOT讓鏡像它變得更小,那就是后話了,不在本文中介紹。

如何創(chuàng)建一個帶診斷工具的.NET鏡像

常用的工具

因為公司是自建機房,所以對于存儲和網(wǎng)絡(luò)帶寬都比較寬裕,我們一般會在生產(chǎn)環(huán)境運行的鏡像中安裝下面這些工具。

RUN dotnet tool install -g dotnet-dump \
    && dotnet tool install -g dotnet-trace \
    && dotnet tool install -g dotnet-counters \
    && dotnet tool install -g dotnet-sos \
    && dotnet tool install -g dotnet-gcdump \
    && dotnet tool install -g dotnet-monitor \
    && dotnet tool install -g dotnet-symbol \
    && dotnet tool install -g JetBrains.dotTrace.GlobalTools

在遇到線上問題的時候,排查起來非常方便,對于一些內(nèi)存泄漏和CPU滿的問題,配合dotTrace很容易就能定位到問題所在。

以上就是“如何創(chuàng)建一個帶診斷工具的.NET鏡像”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI