优化 .net core 应用的 dockerfile
程序员文章站
2022-04-09 15:25:24
优化 .net core 应用的 dockerfile Intro 在给 .net core 应用的写 dockerfile 的时候一直有个苦恼,就是如果有很多个项目,在 dockerfile 里写起来就会很繁琐,有很多项目文件要 copy,dockerfile 还不支持直接批量复制项目文件,今天要 ......
优化 .net core 应用的 dockerfile
intro
在给 .net core 应用的写 dockerfile 的时候一直有个苦恼,就是如果有很多个项目,在 dockerfile 里写起来就会很繁琐,有很多项目文件要 copy,dockerfile 还不支持直接批量复制项目文件,今天要改的一个项目也是有好多个项目文件,不想再一个一个复制,于是 google 一下看有没有比较好的解决方案,找到一个折中的解决方案,分享一下
solution
- 首先把所有的项目文件拷贝到 docker 镜像内
copy */*.csproj ./
- 然后根据项目文件名称创建项目文件夹,并移动项目文件到对应的项目目录下
原来的 dockerfile
from mcr.microsoft.com/dotnet/core/sdk:3.0-alpine as build-env workdir /src # copy csproj and restore as distinct layers copy activityreservation.common/*.csproj activityreservation.common/ copy activityreservation.models/*.csproj activityreservation.models/ copy activityreservation.dataaccess/*.csproj activityreservation.dataaccess/ copy activityreservation.business/*.csproj activityreservation.business/ copy activityreservation.helper/*.csproj activityreservation.helper/ copy activityreservation.wechatapi/*.csproj activityreservation.wechatapi/ copy activityreservation.adminlogic/*.csproj activityreservation.adminlogic/ copy activityreservation.api/*.csproj activityreservation.api/ copy activityreservation/activityreservation.csproj activityreservation/ # run dotnet restore activityreservation/activityreservation.csproj ## diff between netcore2.2 and netcore3.0 workdir /src/activityreservation run dotnet restore # copy everything and build copy . . run dotnet publish -c release -o out activityreservation/activityreservation.csproj # build runtime image from mcr.microsoft.com/dotnet/core/aspnet:3.0-alpine label maintainer="weihanli" workdir /app copy --from=build-env /src/activityreservation/out . expose 80 entrypoint ["dotnet", "activityreservation.dll"]
修改之后的 dockerfile
from mcr.microsoft.com/dotnet/core/sdk:3.0-alpine as build-env workdir /src # copy csproj and restore as distinct layers # https://andrewlock.net/optimising-asp-net-core-apps-in-docker-avoiding-manually-copying-csproj-files-part-2/ copy */*.csproj ./ run for file in $(ls *.csproj); do mkdir -p ${file%.*}/ && mv $file ${file%.*}/; done ## diff between netcore2.2 and netcore3.0 workdir /src/activityreservation run dotnet restore # copy everything and build copy . . run dotnet publish -c release -o out activityreservation/activityreservation.csproj # build runtime image from mcr.microsoft.com/dotnet/core/aspnet:3.0-alpine label maintainer="weihanli" workdir /app copy --from=build-env /src/activityreservation/out . expose 80 entrypoint ["dotnet", "activityreservation.dll"]
是不是精简了许多,来看一下修改前后的对比,更明显的对比一下:
核心代码:
# 拷贝所有的二级目录下的项目文件 copy */*.csproj ./ # 根据项目文件名称创建项目文件夹,并移动项目文件到对应的项目目录下 run for file in $(ls *.csproj); do mkdir -p ${file%.*}/ && mv $file ${file%.*}/; done
more
注:上面的方法适用于项目文件目录名称和项目文件名称一致的情况,默认创建的项目应该都会符合这样的要求,如果你的项目文件是三级目录,如 src/*/*.csproj
的,需要自己根据项目情况调整 dockerfile
有没有学到呢~~
reference
上一篇: 怎样煮西米露你清楚吗,过往的你可能煮错了
下一篇: Docker基础入门
推荐阅读
-
Visual Studio 2017下ASP.NET CORE的TagHelper智能提示解决办法
-
ASP.NET Core基于微软微服务eShopOnContainer事件总线EventBus的实现
-
net core WebApi——尝试企业微信内部应用
-
asp.net下GDI+的一些常用应用(水印,文字,圆角处理)技巧
-
.Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用
-
ASP.NET Core中预压缩静态文件的方法步骤
-
解析Android开发优化之:软引用与弱引用的应用
-
使用.Net Core + Vue + IdentityServer4 + Ocelot 实现一个简单的DEMO +源码
-
你所不知道的ASP.NET Core MVC/WebApi基础系列 (一)
-
.Net core下直接执行SQL语句并生成DataTable的实现方法