使用 docker 编译运行 abp 项目

使用 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
使用 docker 编译运行 abp 项目

进入容器后执行如下命令创建项目

# 如果nuget缓存有问题,可以使用一下命令清理缓存
dotnet nuget locals all -c

# 切换到工作目录
cd /root/dotnet

# 使用 abp 命令行生成一个解决方案
abp new AOA.AbpOnDocker

# 退出容器
exit
使用 docker 编译运行 abp 项目

退出容器后,修改项目里的连接串配置

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

输出如下

数据库表及初始化数据生成

使用 docker 编译运行 abp 项目

还原js包

使用 docker 编译运行 abp 项目

发布web项目并生成镜像

使用 docker 编译运行 abp 项目

执行 docker images 看到镜像已经生成成功了,同时会看到一个 none的镜像

使用 docker 编译运行 abp 项目

这个镜像是docker编译过程中生成的中间镜像,可以执行

docker system prune

命令清除这个无用的镜像。

运行 docker 镜像

docker run --rm -it -p 44324:443 -p 8024:80 abpondocker

现在打开浏览器访问一下8024端口,abp vnext框架已经跑起来了。

使用 docker 编译运行 abp 项目

总结,把官方sdk镜像作为基础镜像,我们可以随意添加所需的工具,生成满足自己使用要求的镜像,比如abp框架,需要abp cli, nodejs, npm, yarn, gulp 等工具,我们新构建含有这些工具的sdk镜像,通过docker就可以轻轻松松的做到不在宿主机建立dotnet core 环境,而进行dotnet编译构建运行等操作。本文以abp为例,不同的项目所需工具不尽相同,读者同学们可以根据实际需要构建自己的镜像。为了方便学习,本文相关文件可以在 https://github.com/coolincy/dotnetStart 中找到。

欢迎关注公众号 “dotnet 新征程”

使用 docker 编译运行 abp 项目

原文出处:微信公众号【dotnet 新征程 dotnet 新征程 】

原文链接:https://mp.weixin.qq.com/s/VKcVJoOJBmn0plxr4OO6dg

本文观点不代表Dotnet9立场,转载请联系原作者。

发表评论

登录后才能评论