使用 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/tools RUN 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/Shanghai RUN 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

进入容器后执行如下命令创建项目
# 如果nuget缓存有问题,可以使用一下命令清理缓存 dotnet nuget locals all -c # 切换到工作目录 cd /root/dotnet # 使用 abp 命令行生成一个解决方案 abp new AOA.AbpOnDocker # 退出容器 exit

退出容器后,修改项目里的连接串配置
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.json
3. 使用sdk31镜像以及asp31镜像生成AbpOnDocker程序镜像
cd ~/dotnet/AOA.AbpOnDocker/aspnet-core
新建Dockerfile,内容如下
FROM asp31 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM 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 新征程”

原文出处:微信公众号【dotnet 新征程 dotnet 新征程】
原文链接:https://mp.weixin.qq.com/s/VKcVJoOJBmn0plxr4OO6dg
本文观点不代表Dotnet9立场,转载请联系原作者。