优化 .net core 应用的 dockerfile
程序员文章站
2022-07-05 08:09: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
上一篇: Pytorch入门之mnist分类实例
下一篇: 跑步减肥的正确方法和十三个好处
推荐阅读
-
.NET Core 3.0 可回收程序集加载上下文的实现
-
asp.net core集成JWT的步骤记录
-
ASP.Net Core中使用枚举类而不是枚举的方法
-
(14)ASP.NET Core 中的日志记录
-
.net core 读取本地指定目录下的文件的实例代码
-
.NET Core/Framework如何创建委托大幅度提高反射调用的性能详解
-
【ASP.NET Core】AddMvc和AddMvcCore的区别
-
.NET CORE中比较两个文件内容是否相同的最快方法
-
Asp.net中处理一个站点不同Web应用共享Session的问题
-
.NET Core 1.0创建Self-Contained控制台应用