教你創(chuàng)建一個(gè)帶診斷工具的.NET鏡像
現(xiàn)階段的問題
現(xiàn)在是云原生和容器化時(shí)代,.NET Core對于云原生來說有非常好的兼容和親和性,dotnet社區(qū)以及微軟為.NET Core提供了非常方便的鏡像容器化方案。所以現(xiàn)在大多數(shù)的dotnet程序都是部署在各種容器化環(huán)境中,比如我們常見的Docker。
微軟官方為.NET提供的許多Docker鏡像,讓我們可以很方便的創(chuàng)建容器化的.NET應(yīng)用。如下所示就是部分官方提供的不同操作系統(tǒng)的鏡像。
其它更詳細(xì)的內(nèi)容大家可以點(diǎn)擊后面的網(wǎng)址查看:https://hub.docker.com/_/microsoft-dotnet-runtime/
使用VS新建一個(gè)項(xiàng)目,微軟官方給出的多段構(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
等工具時(shí)就會發(fā)現(xiàn)使用不了。
而且在沒有安裝.NET SDK的情況下,我們也無法安裝dotnet tool。
解決方案
1.直接使用命令安裝dotnet sdk,然后再安裝dotnet tool,微軟在官網(wǎng)給出的非常方便的安裝方案,但是這不是我們想要的,畢竟每次還得下載多麻煩。
2.構(gòu)建最終鏡像使用sdk
鏡像,這樣的話我們就可以直接安裝好這些工具,這也不是我們想要的,因?yàn)?code>sdk鏡像太大了,不利于我們分發(fā)和下載(自建機(jī)房的鈔能力除外)。
3.就是我們今天提到的方案,我們可以利用Docker多段構(gòu)建,使用sdk
鏡像安裝好dotnet tool以后,直接COPY到我們r(jià)untime的鏡像,然后在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)然我們可以打包一個(gè)包含好工具的runtime,供后面使用,就不用每次都安裝tool了。我個(gè)人比較喜歡使用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讓鏡像它變得更小,那就是后話了,不在本文中介紹。
常用的工具
因?yàn)楣臼亲越C(jī)房,所以對于存儲和網(wǎng)絡(luò)帶寬都比較寬裕,我們一般會在生產(chǎn)環(huán)境運(yù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
在遇到線上問題的時(shí)候,排查起來非常方便,對于一些內(nèi)存泄漏和CPU滿的問題,配合dotTrace很容易就能定位到問題所在。
總結(jié)
本文編寫的初衷是因?yàn)樵谌豪镉泻芏嘈』锇橛龅缴a(chǎn)環(huán)境性能問題的時(shí)候,.NET的runtime鏡像中沒有帶一些工具,安裝和使用起來很麻煩,所以分享一些我們公司內(nèi)部一些技巧,希望能幫到大家。
到此這篇關(guān)于如何創(chuàng)建一個(gè)帶診斷工具的.NET鏡像的文章就介紹到這了,更多相關(guān).NET鏡像帶診斷工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
unity3D實(shí)現(xiàn)物體任意角度自旋轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了unity3D實(shí)現(xiàn)物體任意角度自旋轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07C#實(shí)現(xiàn)微信公眾號群發(fā)消息(解決一天只能發(fā)一次的限制)實(shí)例分享
經(jīng)過幾天研究網(wǎng)上的代碼和謝燦大神的幫忙,今天終于用C#實(shí)現(xiàn)了微信公眾號群發(fā)消息,現(xiàn)在分享一下2013-09-09C#創(chuàng)建一個(gè)小型Web Server(Socket實(shí)現(xiàn))
這篇文章主要介紹了關(guān)于C#利用Socket實(shí)現(xiàn)創(chuàng)建一個(gè)小型Web Server的相關(guān)資料,文中通過示例代碼介紹的很詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-02-02