在前面的两篇文章中,介绍了如何在华为鲲鹏架构及其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
进入容器后执行如下命令创建项目
# 如果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 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 新征程"