赞
踩
这篇文章介绍在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 中找到。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。