使用 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

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

# 如果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 新征程"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法--数组中的逆序对

题目:在数组中的两个数字如果签名一个数字大于后面的数组,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 案例:输入数组{7,5,6,4}中一共有5个逆序对分别是{7,6},{7,5}&#x…

用了这么多年的泛型,你对它到底有多了解?

现代程序员写代码没有人敢说自己没用过泛型,这个泛型模板T可以被任何你想要的类型替代,确实很魔法很神奇,很多人也习以为常了,但就是这么有趣的泛型T底层到底是怎么帮你实现的,不知道有多少人清楚底层玩法,…

数据结构与算法--两个链表中第一个公共节点

链表中第一个公共节点 公节点定义:同一个节点在两个链表中,并不是节点值相同题目:输入两个节点,找出他们的第一个公共节点,节点定义如需 /*** 链表元素节点** author liaojiamin* Date:Created in 12:17 2021/3/5*/ …

ASP.NET Core技术研究-全面认识Web服务器Kestrel

因为IIS不支持跨平台的原因,我们在升级到ASP.NET Core后,会接触到一个新的Web服务器Kestrel。相信大家刚接触这个Kestrel时,会有各种各样的疑问。今天我们全面认识一下ASP.NET Core的默认Web服务器Kestrel。一、初识Kestrel首先,K…

数据结构与算法--二叉堆(最大堆,最小堆)实现及原理

二叉堆(最大堆,最小堆)实现及原理 二叉堆与二叉查找树一样,堆也有两个性质,即结构性质和堆性质。和AVL树一样,对堆的一次操作必须到堆的所有性质都被满足才能终止,也就是我们每次对堆的操作都必…

Blazor WebAssembly 3.2.0 已在塔架就位 将发射新一代前端SPA框架

最美人间四月天,春光不负赶路人。在充满无限希望的明媚春天里,一路风雨兼程的.NET团队正奋力实现新的突破。根据计划,新一代基于WebAssembly 技术研发的前端SPA框架Blazor 将于5月19日在微软Build大会升空。目前,Blazor 的测试工作…

如何将 Azure 上的 Ubuntu 19.10 服务器升级到 20.04

点击上方蓝字关注“汪宇杰博客”导语Ubuntu 20.04 LTS 已经正式推出了。作为一名软粉,看到新版鲍叔毒瘤,我当然是激动万分,抱着批判的态度,第一时间很不情愿的更新了我的服务器。4月23日发布的 Ubuntu 20.04 是个 LTS 版。其 Linu…

我想快速给WPF程序添加托盘菜单

我想...1 简单要求:使用开源控件库在XAML中声明托盘菜单,就像给控件添加ContextMenu一样封装了常用命令,比如:打开主窗体、退出应用程序等TerminalMACS我在TerminalMACS中添加了托盘菜单,最终实现的托盘菜单效果&#…

【半译】在ASP.NET Core中创建内部使用作用域服务的Quartz.NET宿主服务

在我的上一篇文章《在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度》,我展示了如何使用ASP.NET Core创建Quartz.NET托管服务并使用它来按计划运行后台任务。不幸的是,由于Quartz.NET API的工作方式,在Quartz作业中使用Scoped依…

mysql技术分享-- 视图是什么

视图 最近遇到mysql锁相关问题,在查阅资料时候,经常能看到在锁的解释中总有视图的概念出现,因此我觉得有必要先去了解一下视图相关的详细信息,有助于我对mysql锁相关的理解。视图(View)是一个命名的虚拟表…

在 Visual Studio 2019 中为 .NET Core WinForm App 启用窗体设计器

当我们在使用 Visual Studio 2019 非预览版本开发 Windows Forms App (.NET Core) 应用程序时是不能使用窗体设计器的。即使在窗体文件上右击选择“显示设计器”菜单,仍旧只能看到代码,无法打开窗体设计器。根据微软开发者博客的描述,我们可以…

mysql技术分享--表分区实现

分区表 分区概念 分区功能并不是在存储引擎层完成的,因此不止有InnoDB存储引擎支持分区,常见的存储引擎MyISAM,NDB等都支持。但是也并不是所有存储引擎都支持,比如CSV,FEDERATED,MERGE等就不支持&#xf…

视频号,张小龙的星辰大海

阅读本文大概需要 4.1分钟。前段时间,微信开通了视频号。本想第一时间写一篇文章,分析下视频号。发现理解还不深入,于是这段时间一直在思考视频号对微信的战略意义和它的前景。思考了接近1个月,想明白了一些事情,有时候…