使用 docker 编译运行 abp 项目

Docker 同时被 2 个专栏收录
43 篇文章 0 订阅
424 篇文章 3 订阅

这篇文章介绍在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 中找到。

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值