使用 docker 编译运行 abp 项目
在前面的兩篇文章中,介紹了如何在華為鯤鵬架構及其Euler系統上運行dotnet core, 使用docker運行了默認的mvc模板項目,這篇文章繼續介紹在docker中運行更復雜的dotnet core項目,這里以業內鼎鼎大名的abp vnext框架,版本 2.6 為例。
我們還是假設宿主機不涉及任何 dotnet 環境,所有的dotnet操作全部由docker鏡像來處理。
1.? 生成幾個dotnet core的擴展鏡像
a.? sdk31鏡像?Dockerfile.sdk31
在官方的 sdk:3.1鏡像上設置中國時區,添加部分linux實用小工具,添加dotnet-ef, volo.abp.cli, nodejs, npm, yarn, gulp等生成編譯abp框架所需工具
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build MAINTAINER Coolincy coolincy@qq.com# 設定UTF-8及中文時區,并將 apt 包源改為阿里云鏡像 ENV LANG C.UTF-8 ENV TZ Asia/Shanghai ENV PATH $PATH:/root/.dotnet/toolsRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo 'Asia/Shanghai' > /etc/timezone \ && sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \ && sed -i s@/security.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \ && apt clean# 更新軟件包,并添加部分小工具 RUN apt update && apt upgrade -y && apt autoremove -y \ && apt install apt-utils nano wget dnsutils inetutils-ping net-tools iproute2 expect apt-transport-https -y \ && dotnet tool install -g dotnet-ef \ && dotnet tool install -g volo.abp.cli# 安裝 nodejs 12.x RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - \ && apt install nodejs -y# 將 npm 包源改為阿里云鏡像,安裝 yarn 及 gulp RUN npm config set registry https://registry.npm.taobao.org \ && echo sass_binary_site=https://npm.taobao.org/mirrors/node-sass/ >> /root/.npmrc \ && echo phantomjs_cdnurl=http://npm.taobao.org/mirrors/phantomjs >> /root/.npmrc \ && echo electron_mirror=https://npm.taobao.org/mirrors/electron/ >> /root/.npmrc \ && npm update -g && npm -g install yarn && npm -g install gulp-cli && npm info gulp-cli#docker build --pull -t sdk31 . -f Dockerfile.sdk31執行?docker build --pull -t sdk31 . -f Dockerfile.sdk31?生成鏡像
b.? asp31鏡像?Dockerfile.asp31
在官方的 aspnet:3.1鏡像上設置中國時區,添加部分linux實用小工具
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 MAINTAINER Coolincy coolincy@qq.com# 設定UTF-8及中文時區,并將 apt 包源改為阿里云鏡像 ENV LANG C.UTF-8 ENV TZ Asia/ShanghaiRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo 'Asia/Shanghai' > /etc/timezone \ && sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \ && sed -i s@/security.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \ && apt clean# 更新軟件包,并添加部分小工具 RUN apt update && apt upgrade -y && apt autoremove -y \ && apt install apt-utils dmidecode nano wget dnsutils inetutils-ping net-tools iproute2 -y#docker build --pull -t asp31 . -f Dockerfile.asp31執行?docker build --pull -t asp31 . -f Dockerfile.asp31?生成鏡像
c.? aspgdi31鏡像?Dockerfile.aspgdi31
在asp31鏡像上添加gdiplus庫,使 dotnet core 支持gdi圖形操作
FROM asp31 MAINTAINER Coolincy coolincy@qq.com# 添加 gdi RUN apt install libfontconfig1 libgdiplus -y RUN ln -s libgdiplus.so gdiplus.dll RUN ln -s /lib/x86_64-linux-gnu/libdl-2.24.so /lib/x86_64-linux-gnu/libdl.so# arm64 架構將上面一句改成下面兩句 #RUN ln -s /lib/aarch64-linux-gnu/ld-2.28.so /lib/aarch64-linux-gnu/ld.so #RUN ln -s /lib/aarch64-linux-gnu/ld-2.28.so /lib/aarch64-linux-gnu/libdl.so#docker build -t aspgdi31 . -f Dockerfile.aspgdi31執行?docker build -t aspgdi31 . -f Dockerfile.aspgdi31?生成鏡像
2.? 使用sdk31鏡像新建一個默認配置的abp項目
使用docker運行sdk31鏡像,同時映射幾個目錄
~/dotnet : 用于存放生成的項目文件
~/.abp : abp命令行工具緩存?
~/.local/share/NuGet/v3-cache : NuGet源緩存
~/.nuget/packages : NuGet包緩存
映射緩存目錄是為了以后使用更快
docker run --rm -it \ -v ~/dotnet:/root/dotnet \ -v ~/.abp:/root/.abp \ -v ~/.local/share/NuGet/v3-cache:/root/.local/share/NuGet/v3-cache \ -v ~/.nuget/packages:/root/.nuget/packages \ sdk31 bash進入容器后執行如下命令創建項目
退出容器后,修改項目里的連接串配置
cd ~/dotnet/ nano AOA.AbpOnDocker/aspnet-core/src/AOA.AbpOnDocker.DbMigrator/appsettings.json修改連接串(具體根據自己實際情況修改,如果SQLServer登錄賬號沒有建庫權限,那么必須先在SQLServer上創建指定數據庫)為:
Server=localhost; Database=AbpOnDocker; User ID=AbpOnDocker; Password=1q2w3e*; Trusted_Connection=False;
同樣修改Web項目里的連接串,同上一步,這里不再列出。
nano ~/dotnet/AOA.AbpOnDocker/aspnet-core/src/AOA.AbpOnDocker.Web/appsettings.json3.? 使用sdk31鏡像以及asp31鏡像生成AbpOnDocker程序鏡像
cd ~/dotnet/AOA.AbpOnDocker/aspnet-core新建Dockerfile,內容如下
FROM asp31 AS base WORKDIR /app EXPOSE 80 EXPOSE 443FROM sdk31 AS publish# copy proj and restore as distinct layers WORKDIR /src COPY . . RUN dotnet restore "src/AOA.AbpOnDocker.Web/AOA.AbpOnDocker.Web.csproj" \ && dotnet restore "src/AOA.AbpOnDocker.DbMigrator/AOA.AbpOnDocker.DbMigrator.csproj"# db migrator WORKDIR "/src/src/AOA.AbpOnDocker.DbMigrator" RUN dotnet run -c Release# publish WORKDIR "/src/src/AOA.AbpOnDocker.Web" RUN yarn && gulp \ && dotnet publish "AOA.AbpOnDocker.Web.csproj" -c Release -o /app/publish# build docker image FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "AOA.AbpOnDocker.Web.dll"]編譯 docker 鏡像
docker build -t abpondocker . -f Dockerfile輸出如下
數據庫表及初始化數據生成
還原js包
發布web項目并生成鏡像
執行 docker images 看到鏡像已經生成成功了,同時會看到一個 none的鏡像
這個鏡像是docker編譯過程中生成的中間鏡像,可以執行
docker system prune命令清除這個無用的鏡像。
運行 docker 鏡像
docker run --rm -it -p 44324:443 -p 8024:80 abpondocker現在打開瀏覽器訪問一下8024端口,abp vnext框架已經跑起來了。
總結,把官方sdk鏡像作為基礎鏡像,我們可以隨意添加所需的工具,生成滿足自己使用要求的鏡像,比如abp框架,需要abp cli, nodejs, npm, yarn, gulp 等工具,我們新構建含有這些工具的sdk鏡像,通過docker就可以輕輕松松的做到不在宿主機建立dotnet core 環境,而進行dotnet編譯構建運行等操作。本文以abp為例,不同的項目所需工具不盡相同,讀者同學們可以根據實際需要構建自己的鏡像。為了方便學習,本文相關文件可以在 https://github.com/coolincy/dotnetStart 中找到。
歡迎關注公眾號 "dotnet 新征程"
總結
以上是生活随笔為你收集整理的使用 docker 编译运行 abp 项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我是如何一步步的在并行编程中将lock锁
- 下一篇: 用了这么多年的泛型,你对它到底有多了解?