.NET与鲲鹏共展翅,昇腾九万里(二)
在上一篇文章?.NET與鯤鵬共展翅,昇騰九萬(wàn)里(一)中,我們通過(guò)在鯤鵬架構(gòu)的Euler系統(tǒng)上跑Docker的方式把dotnet core 跑起來(lái)了,有讀者反饋說(shuō)“還是走docker嘍,你這個(gè)標(biāo)題應(yīng)該改成鯤鵬和docker兩條鯨魚(yú)的故事”。這里要說(shuō)明一下,dotnet core 在鯤鵬上的Euler系統(tǒng)里原生就能跑起來(lái),使用docker只是為了簡(jiǎn)化應(yīng)用環(huán)境配置以及隔離各種應(yīng)用對(duì)操作系統(tǒng)的配置污染(比如修改環(huán)境變量,設(shè)定執(zhí)行路徑,變更各種配置)從而導(dǎo)致新的應(yīng)用配置好后,原有應(yīng)用可能掛掉的問(wèn)題。
在這里,我也簡(jiǎn)單的介紹一下在Euler系統(tǒng)下直接安裝dotnet core SDK的方法。
1. 安裝幾個(gè)必備庫(kù)
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驗(yàn)證一下。
另外可以將最后兩個(gè)2個(gè)export添加到 /etc/profile,這樣每次登錄都可以直接使用 dotnet 命令了。
現(xiàn)在接著上一篇文章的內(nèi)容,我們看看如何使用.NET SDK 的 Docker鏡像編譯 .NET Core程序,并使用Docker將它跑起來(lái)。
一、使用Docker 鏡像創(chuàng)建dotnet core 項(xiàng)目
1. 拉取dotnet core sdk 3.1的鏡像
docker pull mcr.microsoft.com/dotnet/core/sdk:3.12. 新建一個(gè)dotnet core 項(xiàng)目
先在本地建一個(gè)目錄
mkdir -p ~/dotnet/mvctest現(xiàn)在執(zhí)行如下命令,新建一個(gè)sdk鏡像的容器,并進(jìn)入交互界面,這里使用了 -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進(jìn)入容器后執(zhí)行
dotnet new mvc -n mvctest -o ~/dotnet/mvctest這一步跟平時(shí)我們使用dotnet命令行沒(méi)什么區(qū)別,這里就是利用 sdk鏡像創(chuàng)建一個(gè)dotnet core 項(xiàng)目
輸入exit退出容器,由于剛才使用 --rm 參數(shù)運(yùn)行sdk鏡像,退出后容器自動(dòng)銷(xiāo)毀。
看一下本機(jī)的~/dotnet/mvctest是否已經(jīng)有內(nèi)容了
二、使用sdk鏡像來(lái)編譯這個(gè)新建的項(xiàng)目,并生成鏡像
1. 在mvctest目錄下新建一個(gè)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個(gè)鏡像:
mcr.microsoft.com/dotnet/core/sdk:3.1?用于編譯
mcr.microsoft.com/dotnet/core/aspnet:3.1 用于mvctest的基礎(chǔ)鏡像
2. 編譯dotnet項(xiàng)目并生成mvctest鏡像,如果本地已有最新的sdk及aspnet鏡像,以下參數(shù)中的 --pull 可以省略加快編譯速度
docker build --pull -t mvctest . -f Dockerfile3. 看下生成的鏡像
4. 運(yùn)行這個(gè)鏡像
程序成功運(yùn)行,輸出如下
瀏覽器打開(kāi)地址展示如下
正式使用可以去掉--rm -it兩個(gè)參數(shù),改成-d --restart=unless-stopped,這樣程序?qū)⒃诤笈_(tái)運(yùn)行,不會(huì)出現(xiàn)交互界面,當(dāng)異常退出后,docker也能自動(dòng)將其重新運(yùn)行起來(lái)
docker run -d --restart=unless-stopped -p 80:80 mvctest至此,dotnet core與鯤鵬架構(gòu)及Euler系統(tǒng)相關(guān)的部分內(nèi)容已經(jīng)結(jié)束,所有在其他平臺(tái)上正常運(yùn)行的程序,基本上不需要修改即可在鯤鵬架構(gòu)下的Euler系統(tǒng)上運(yùn)行。這里提一點(diǎn),由于鯤鵬是arm64架構(gòu)的,有些dotnet包底層引用了c++編寫(xiě)的dll,比如System.Data.SQLite, 并且該nuget包里沒(méi)有包含arm64的dll,如果你的使用了這樣的包,在鯤鵬架構(gòu)下將會(huì)報(bào)告找不到dll的錯(cuò)誤,解決方法有2種,一種是自己去找到arm64使用的dll, 拷貝到項(xiàng)目中,另外一種就是換成其他支持arm64的包,比如System.Data.SQLite有個(gè)替代的由微軟出品的 Microsoft.Data.Sqlite。當(dāng)然了這種情況比較少,目前我所涉及的項(xiàng)目只有Sqlite掉坑里了。
總結(jié)
以上是生活随笔為你收集整理的.NET与鲲鹏共展翅,昇腾九万里(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用dnSpy调试asp.net cor
- 下一篇: 微服务统计,分析,图表,监控, 分布式追