.NET与鲲鹏共展翅,昇腾九万里(二)
在上一篇文章?.NET與鯤鵬共展翅,昇騰九萬里(一)中,我們通過在鯤鵬架構(gòu)的Euler系統(tǒng)上跑Docker的方式把dotnet core 跑起來了,有讀者反饋說“還是走docker嘍,你這個標題應(yīng)該改成鯤鵬和docker兩條鯨魚的故事”。這里要說明一下,dotnet core 在鯤鵬上的Euler系統(tǒng)里原生就能跑起來,使用docker只是為了簡化應(yīng)用環(huán)境配置以及隔離各種應(yīng)用對操作系統(tǒng)的配置污染(比如修改環(huán)境變量,設(shè)定執(zhí)行路徑,變更各種配置)從而導(dǎo)致新的應(yīng)用配置好后,原有應(yīng)用可能掛掉的問題。
在這里,我也簡單的介紹一下在Euler系統(tǒng)下直接安裝dotnet core SDK的方法。
1. 安裝幾個必備庫
2. 下載 dotnet core sdk arm64 的包,這里以 3.1.201版本為例,其他版本地址可以去?dotnet core 官網(wǎng)獲取
wget https://download.visualstudio.microsoft.com/download/pr/98a2e556-bedd-46c8-b3fa-96a9f1eb9556/09f60d50e3cbba0aa16d48ceec9dcb0b/dotnet-sdk-3.1.201-linux-arm64.tar.gz3. 解壓并安裝 dotnet-sdk-3.1.201-linux-arm64.tar.gz,這里假定將sdk安裝到 /usr/share/dotnet/
mkdir -p /usr/share/dotnet/ tar zxf dotnet-sdk-3.1.201-linux-arm64.tar.gz -C /usr/share/dotnet/ export DOTNET_ROOT=/usr/share/dotnet/ export PATH=$PATH:/usr/share/dotnet/好了,到這里dotnet core sdk就安裝完成了,你可以輸入dotnet –info驗證一下。
另外可以將最后兩個2個export添加到 /etc/profile,這樣每次登錄都可以直接使用 dotnet 命令了。
現(xiàn)在接著上一篇文章的內(nèi)容,我們看看如何使用.NET SDK 的 Docker鏡像編譯 .NET Core程序,并使用Docker將它跑起來。
一、使用Docker 鏡像創(chuàng)建dotnet core 項目
1. 拉取dotnet core sdk 3.1的鏡像
docker pull mcr.microsoft.com/dotnet/core/sdk:3.12. 新建一個dotnet core 項目
先在本地建一個目錄
mkdir -p ~/dotnet/mvctest現(xiàn)在執(zhí)行如下命令,新建一個sdk鏡像的容器,并進入交互界面,這里使用了 -v ~/dotnet/mvctest:/root/dotnet/mvctest 參數(shù)將外部的文件夾映射到容器內(nèi)
docker run --rm -it \ -v ~/dotnet/mvctest:/root/dotnet/mvctest \ mcr.microsoft.com/dotnet/core/sdk:3.1 \ bash進入容器后執(zhí)行
dotnet new mvc -n mvctest -o ~/dotnet/mvctest這一步跟平時我們使用dotnet命令行沒什么區(qū)別,這里就是利用 sdk鏡像創(chuàng)建一個dotnet core 項目
輸入exit退出容器,由于剛才使用 --rm 參數(shù)運行sdk鏡像,退出后容器自動銷毀。
看一下本機的~/dotnet/mvctest是否已經(jīng)有內(nèi)容了
二、使用sdk鏡像來編譯這個新建的項目,并生成鏡像
1. 在mvctest目錄下新建一個Dockerfile,內(nèi)容如下
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build WORKDIR /source# copy proj and restore as distinct layers COPY . . RUN dotnet restore RUN dotnet publish -c release -o /app --no-restore# create app image FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 WORKDIR /app COPY --from=build /app . ENTRYPOINT ["dotnet", "mvctest.dll"]里面引用了2個鏡像:
mcr.microsoft.com/dotnet/core/sdk:3.1?用于編譯
mcr.microsoft.com/dotnet/core/aspnet:3.1 用于mvctest的基礎(chǔ)鏡像
2. 編譯dotnet項目并生成mvctest鏡像,如果本地已有最新的sdk及aspnet鏡像,以下參數(shù)中的 --pull 可以省略加快編譯速度
docker build --pull -t mvctest . -f Dockerfile3. 看下生成的鏡像
4. 運行這個鏡像
程序成功運行,輸出如下
瀏覽器打開地址展示如下
正式使用可以去掉--rm -it兩個參數(shù),改成-d --restart=unless-stopped,這樣程序?qū)⒃诤笈_運行,不會出現(xiàn)交互界面,當異常退出后,docker也能自動將其重新運行起來
docker run -d --restart=unless-stopped -p 80:80 mvctest至此,dotnet core與鯤鵬架構(gòu)及Euler系統(tǒng)相關(guān)的部分內(nèi)容已經(jīng)結(jié)束,所有在其他平臺上正常運行的程序,基本上不需要修改即可在鯤鵬架構(gòu)下的Euler系統(tǒng)上運行。這里提一點,由于鯤鵬是arm64架構(gòu)的,有些dotnet包底層引用了c++編寫的dll,比如System.Data.SQLite, 并且該nuget包里沒有包含arm64的dll,如果你的使用了這樣的包,在鯤鵬架構(gòu)下將會報告找不到dll的錯誤,解決方法有2種,一種是自己去找到arm64使用的dll, 拷貝到項目中,另外一種就是換成其他支持arm64的包,比如System.Data.SQLite有個替代的由微軟出品的 Microsoft.Data.Sqlite。當然了這種情況比較少,目前我所涉及的項目只有Sqlite掉坑里了。
總結(jié)
以上是生活随笔為你收集整理的.NET与鲲鹏共展翅,昇腾九万里(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用dnSpy调试asp.net cor
- 下一篇: 优化委托的 DynamicInvoke