首页 > 其他分享 >.NET如何创建Dockerfile文件构建镜像?

.NET如何创建Dockerfile文件构建镜像?

时间:2024-01-10 14:46:34浏览次数:28  
标签:WebApplication1 app publish build dotnet 镜像 NET Dockerfile

创建一个WebApi项目,并且创建一个Dockerfile空文件,添加以下代码,7.0代表的你项目使用的SDK的版本,构建的时候也需要选择好指定的镜像tag

  1. FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
  2. WORKDIR /app
  3. EXPOSE 80
  4. EXPOSE 443
  5. FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
  6. ARG BUILD_CONFIGURATION=Release
  7. WORKDIR /src
  8. COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
  9. RUN dotnet restore "./WebApplication1/./WebApplication1.csproj"
  10. COPY . .
  11. WORKDIR "/src/WebApplication1"
  12. RUN dotnet build "./WebApplication1.csproj" -c $BUILD_CONFIGURATION -o /app/build
  13. FROM build AS publish
  14. ARG BUILD_CONFIGURATION=Release
  15. RUN dotnet publish "./WebApplication1.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
  16. FROM base AS final
  17. WORKDIR /app
  18. COPY --from=publish /app/publish .
  19. ENTRYPOINT ["dotnet", "WebApplication1.dll"]
我们一步一步来进行讲解,首先第一步,FROM指定了一个mcr.microsoft.com/dotnet/aspnet:7.0镜像,并且AS别名base,这一步是选择aspnet:7.0作为基础运行镜像,as别名用于方便以下步骤使用。
  1. FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
  2. WORKDIR /app
  3. EXPOSE 80
  4. EXPOSE 443
然后下一步,在这里FROM了一个mcr.microsoft.com/dotnet/sdk:7.0 的镜像并且AS别名build,这个镜像当中是使用到了.NET SDK作为镜像用于将项目构建成部署文件,在这里的COPY的目录的位置是从你docker build ./ 的这个./的目录作为根目录的,请注意如果出现文件未找到的情况下可能就是工作目录与Dockerfile目录不一致导致,在构建的时候指定了构建完成到/app/build目录中。
  1. FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
  2. ARG BUILD_CONFIGURATION=Release
  3. WORKDIR /src
  4. COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
  5. RUN dotnet restore "./WebApplication1/./WebApplication1.csproj"
  6. COPY . .
  7. WORKDIR "/src/WebApplication1"
  8. RUN dotnet build "./WebApplication1.csproj" -c $BUILD_CONFIGURATION -o /app/build
在这里FROM了上面的build然后继续AS别名了publish在这里使用了dotnet publish将源码进行了构建部署,上面的build操作是为了将编译过程和构建镜像的过程分离。
  1. FROM build AS publish
  2. ARG BUILD_CONFIGURATION=Release
  3. RUN dotnet publish "./WebApplication1.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
这里使用到了最开始的base然后别名final,然后指定工作目录,使用COPY --from指定了上面的publish的构建镜像,然后将镜像构建的/app/publish中目录下面的所有的文件COPY到/app下,然后给镜像配置容器启动时运行的命令,则是我们的.NET Core项目启动命令,执行我们的项目。
  1. FROM base AS final
  2. WORKDIR /app
  3. COPY --from=publish /app/publish .
  4. ENTRYPOINT ["dotnet", "WebApplication1.dll"]

 

 

出处:https://www.duidaima.com/Group/Topic/ASP.NET/18770

标签:WebApplication1,app,publish,build,dotnet,镜像,NET,Dockerfile
From: https://www.cnblogs.com/mq0036/p/17956433

相关文章

  • .NET Core MemoryCache缓存批量获取Key或者删除
    .NetCore下使用缓存,除了大家耳熟能详的Redis做分布式缓存外,本地内存缓存也会一起结合来使用,它存取更快,使我们的应用达到极致性能要求。这也是我们经常提到的3级或者4级缓存,每一层都有自己的使用场景,优缺点,结合业务特点来选择合适的才是王道。这里我们就使用Net原生的Microsoft......
  • electron-vite 安装, 打包下载资源失败,设置国内镜像
    由于electron默认打包会从github上下载相关二进制包,众所周知,国内GitHub访问是相当慢的,所以经常会出现下载失败导致打包不成功,这时我们就需要配置国内的镜像源,以解决从GitHub下载慢甚至无法下载的问题。修改npm配置文件(没有就创建):npm的配置文件为用户根目录下的:~/.npmrc(Windows路......
  • allegro 中如何对任意对象进行镜像mirror操作 Allegro PCB17.2+
    相信使用cadence套件的工程师都知道这块EDA工具的效率和功能时十分强大的。但入门这款工具,相对来讲需要花费的时间和精力时比较多的。allegro提供的众多强大的功能,但这也是这个工具入门不那么容易的一个原因。今天记录一个在布局过程中很实用的一个小功能:AdvancedMirror高级镜......
  • 图解Kubernetes的服务(Service)
    pod准备:不要直接使用和管理Pods:当使用ReplicaSet水平扩展scale时,Pods可能被terminated当使用Deployment时,去更新DockerImageVersion,旧Pods会被terminated,然后创建新Pods0啥是服务(Service)Kubernetes中Service是将运行在一个或一组[Pod]上的网络应用程序公开为网络......
  • 使用Terraform部署华为云和kubernetes资源
    本文分享自华为云社区《使用Terraform部署华为云和kubernetes资源》,作者:可以交个朋友。Terraform概述Terraform是由HashiCorp创建的开源“基础架构即代码”工具。作为一种声明式编码工具,Terraform使开发人员能够使用一种称为HCL(HashiCorp配置语言)的高级配置语言来描述运行应......
  • 组态王与S7-1200PLC之间 Profinet无线以太网通信
    组态王与S7-1200PLC之间想要搭建Profinet无线以太网通信,需要用到以下设备:●西门子PLC型号:S7-1200×2台●上位机:组态王6.55×1台●无线通讯终端:DTD418MB×3块●主从关系:1主2从●通讯接口:RJ45接口●供电:12-24VDC通讯搭建时,用户无需更改网络参数和原有程序,也不必了解协议......
  • 在Kubernetes中优雅地导出和清理Ingress资源
    引言Kubernetes的Ingress资源是定义外部访问集群服务的规则。随着微服务架构和容器化技术的普及,Ingress作为路由流量的关键组件变得愈发重要。当我们需要在环境之间迁移Ingress资源或者备份当前的配置时,就会用到导出功能。然而,直接使用kubectl导出可能会包括一些我们不需要的元数......
  • VNET Encryption预览
    这次介绍的功能VNETEncryption也是在Global预览的,在21v估计要等段时间,不过这个功能不需要填表来开通,属于可以直接用的。VNETEncryption顾名思义就是网络加密,正常情况下VNET内部的这些流量都是不加密的,其实对于使用没有什么影响,不过有些时候如果有比较多合规上的要求,可能会对加密......
  • 删除Azure Container Registry中tag为null的容器镜像
    删除AzureContainerRegistry中tag为null的容器镜像近几年容器技术的蓬勃发展,越来越多的客户开始在Azure中使用AKS,ACR等容器相关的Azure服务,来满足其不断发展的业务使用需求。但随着时间的推移和业务复杂性的增长,很多客户都会发现,ACR中的某些Repo内,显示的清单计数和实际的清单数量......
  • netty: Marshalling序列化示例
    一、请求对象和响应对象,分别要实现Serializable接口packagecn.edu.tju;importjava.io.Serializable;publicclassUserRequestimplementsSerializable{privateStringusername;privateStringpassword;publicStringgetUsername(){returnus......