优化 .net core 应用的 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-alpineLABEL 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-alpineLABEL Maintainer="WeihanLi"
WORKDIR /app
COPY --from=build-env /src/ActivityReservation/out .
EXPOSE 80
ENTRYPOINT ["dotnet", "ActivityReservation.dll"]

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

640?wx_fmt=jpeg

核心代码:

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

More

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

有没有学到呢~~

Reference

  • https://stackoverflow.com/questions/51372791/is-there-a-more-elegant-way-to-copy-specific-files-using-docker-copy-to-the-work

  • https://andrewlock.net/optimising-asp-net-core-apps-in-docker-avoiding-manually-copying-csproj-files-part-2/

  • https://github.com/WeihanLi/ActivityReservation/blob/dev/Dockerfile

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313160.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 上不了网

http://askubuntu.com/questions/441619/how-to-successfully-restart-a-network-without-reboot-over-ssh 指令: sudo service network-manager restart

C# 8 新特性 - 静态本地方法

从C# 8 开始,本地方法就可以是静态的了。 与其他的本地方法不同,静态的本地方法无法捕获任何本地状态量。 直接看例子: 这段代码里有两个本地方法,他们分别对实例的一个字段和方法里的一个本地变量进行了修改操作,也就…

Caffe使用其他人代码CUDA不兼容问题

只要将别人的上层代码使用即可,底层CUDA还是用自己的版本。

​.NET手撸2048小游戏

前言2048是一款益智小游戏,得益于其规则简单,又和 2的倍数有关,因此广为人知,特别是广受程序员的喜爱。本文将再次使用我自制的“准游戏引擎” FlysEngine,从空白窗口开始,演示如何“手撸” 2048小游戏&…

cannot import caffe

遇到问题“cannot import caffe”首先make pycaffe, 如果不行,分别尝试: 1. export PYHTONPATH/path/to/caffe/python:$PYTHONPATH 注:以上方法只能在当前terminal中生效,如需长久生效,需修改~/.bashrc …

自行实现高性能MVC

wcf虽然功能多、扩展性强但是也面临配置忒多,而且restful的功能相当怪异,并且目前没法移植。asp.net core虽然支持webapi,但是功能也相对繁多、配置复杂。就没有一个能让码农们安安心心的写webapi,无需考虑性能、配置、甚至根据问…

caffe matio问题

http://blog.csdn.net/houqiqi/article/details/46469981 注:如果指令行模式实在解决不了/lib/libcaffe.so: undefined reference to Mat_VarReadDataLinear问题,可以尝试在QT下进行训练和测试。 1, 下载matio(http://sourceforge.NET/pro…

技术管理者怎样跳出“泥潭”

近几年面试了不少新人,当问到职业规划时,大多都会说先积累技术,然后往架构师的方向发展。这可能是技术人的一个特质,喜欢跟机器相处,沉浸在代码之中,而不喜欢跟人打交道。现实的情况是,一些中小…

你或许以为你不需要领域驱动设计

作者:邹溪源,长沙资深互联网从业者,架构师社区合伙人!一犹记得刚刚参加工作时,是地图厂商四维图新集团旗下的一家子公司,主要从事规划测绘相关软件研发的公司。当时我的项目是为勘测设计院提供相对应的应用…

undefined reference to Mat_VarCreate'

我们之前所写的方法,发现只能在QT编译模式下解决这个问题,而在指令行模式下不能编译通过,因为QT模式基于cmake,而make all基于Makefile 因而我们参照DeepLab的Makefile文件: 发现只要将其中关于matio的内容加到我们的…

redis为什么这么火该怎么用

最近一些人在介绍方案时,经常会出现redis这个词,于是很多小伙伴百度完redis也就觉得它是一个缓存,然后项目里面把数据丢进去完事,甚至有例如将实体属性拆分塞进redis hash里面的奇怪用法等等!原因是什么呢?…

Deeplab训练时候unexpected label

先说一些有意义的答案: https://groups.google.com/forum/#!topic/caffe-users/CLF4IZ2Tkqk You probably need to save your labels as 1 Channel png images. Where the labels are encoded with a 0-based index --> in case of voc12 you would needs 21 l…

.Net Core实现健康检查

ASP.NET Core 提供运行状况检查中间件和库,以用于报告应用基础结构组件的运行状况。运行状况探测可以由容器业务流程协调程和负载均衡器用于检查应用的状态。例如,容器业务流程协调程序可以通过停止滚动部署或重新启动容器来响应失败的运行状况检查。负载…

微软宣布加入 OpenJDK,看网上各派的热闹

微软宣布加入 OpenJDK 项目(https://www.oschina.net/news/111036/microsoft-to-participate-in-openidk),这两天在微信公众号里面有几种论调:上面这些都是Javaer的观点,在CSharper 对这件事情的反应更奇怪了&#xff…

cannot find #include caffe/proto/caffe.pb.h

https://github.com/BVLC/caffe/issues/1761 protoc src/caffe/proto/caffe.proto --cpp_out. mkdir include/caffe/protomv src/caffe/proto/caffe.pb.h include/caffe/proto

cell操作-matlab

celldisp:显示所有的内容cell:创建空的元胞数组 cellplot:利用图形方式显示内容cell2mat:将数组转变成为普通的矩阵 mat2cell:将数值矩阵转变成为cell数组num2cell:将数值数组转变成为cell数组cell2struct&…

这6点解释了罗永浩为什么要卖艺

01是的,我们的‘老赖又上热搜了。(ps:还是传统的语法,换了个人而已,味道有点改变)11 月 3 日下午,罗永浩因锤子科技的 375 万欠款被江苏丹阳法院限制高消费,他不得乘坐飞机头等舱、软卧、高铁等…

微软发布研究报告:企业数据管理普遍混乱,揭秘大数据分析趋势以及PowerBI的崛起机遇...

本文非常重要,忽略者责任自负。我们时常看到很多新闻说企业的数据分析或大数据如何如何高大上,但你自己感觉你自己所处的环境呢?很多小伙伴在群里真切的抱怨到:感觉是一坨祥云。为什么你看到的和你感受到的有如此巨大的反差&#…

目标跟踪-粒子滤波算法

http://blog.csdn.net/hujingshuang/article/details/45535423 前言: 粒子滤波广泛的应用于目标跟踪,粒子滤波器是一种序列蒙特卡罗滤波方法,其实质是利用一系列随机抽取的样本(即粒子)来替代状态的后验概率分布。在此…

Magicodes.Pay,打造开箱即用的统一支付库,已提供ABP模块封装

Magicodes.Pay,打造开箱即用的统一支付库,已提供ABP模块封装简介Magicodes.Pay,是心莱科技团队提供的统一支付库,相关库均使用.NET标准库编写,支持.NET Framework以及.NET Core。目前已提供Abp模块的封装,支…