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

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

核心代码:

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

More

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

有没有学到呢~~

Reference

最新文章

  1. Day8-面向对象进阶&&socket基础
  2. DPM算法源程序voc-release5在Windows中的配置修改过程
  3. Windows10 利用 Docker 配置 TensofFlow 深度学习工具
  4. mysql 自连接
  5. 三种实例化bean的方式
  6. 计算阶乘n!末尾0的个数
  7. ViewPager使用笔记
  8. DJANGO中获取登陆用名及别名
  9. js如何判断字符串是否进行过window.btoa()转码
  10. ASP.NET MVC5 学习笔记-4 OWIN和Katana
  11. mongodb 聚合查询
  12. Cestos7安装Elasticsearch5.4.3
  13. OpenGL and Vulkan resources
  14. ThinkPHP3上传文件中遇到的问题
  15. Object转为Bigdecimal
  16. ecshop 安装出错gd_version
  17. c++重载后置++和--
  18. npm install ERR! code E400/E404
  19. map重写比较器
  20. 【HTML+CSS】(2)CSS Sprite雪碧图

热门文章

  1. SpringMVC 图片上传虚拟目录
  2. Xshell无法连接Linux虚拟机问题
  3. selenium自动化测试-浏览器基本操作
  4. CentOS 8 都发布了,你还不会用 nftables?
  5. ViewModel 和 ViewModelProvider.Factory:ViewModel 的创建者
  6. Oracle 查询真实执行计划
  7. mybatis-dynamic-query 3.0 更新
  8. 理解JS引擎的执行机制
  9. SpringBootSecurity学习(14)前后端分离版之 OAuth2.0介绍
  10. Locomotion和Navigation的区别