欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

优化 .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

  1. 首先把所有的项目文件拷贝到 docker 镜像内 copy */*.csproj ./
  2. 然后根据项目文件名称创建项目文件夹,并移动项目文件到对应的项目目录下

原来的 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"]

是不是精简了许多,来看一下修改前后的对比,更明显的对比一下:

优化 .net core 应用的 dockerfile

核心代码:

 # 拷贝所有的二级目录下的项目文件
copy */*.csproj ./
# 根据项目文件名称创建项目文件夹,并移动项目文件到对应的项目目录下
run for file in $(ls *.csproj); do mkdir -p ${file%.*}/ && mv $file ${file%.*}/; done 

more

注:上面的方法适用于项目文件目录名称和项目文件名称一致的情况,默认创建的项目应该都会符合这样的要求,如果你的项目文件是三级目录,如 src/*/*.csproj 的,需要自己根据项目情况调整 dockerfile

有没有学到呢~~

reference