大家好,我是等天黑。

.NET 又双叒叕出新功能了, 就在前几天,.NET 团队发布博客,宣称在 .NET SDK 中内置了对 .NET 应用容器化的支持。

小试牛刀

在正式介绍它之前,先通过一个简单的例子,看下它是如何使用的。

# 创建一个新项目, 然后进入到文件夹
dotnet new mvc -n my-awesome-container-app
cd my-awesome-container-app # 添加下面的程序包
#(目前需要手动引入, 后续会直接集成到 .NET SDK)
dotnet add package Microsoft.NET.Build.Containers # 发布项目
dotnet publish --os linux --arch x64 -p:PublishProfile=DefaultContainer # 在容器中运行应用
docker run -it --rm -p 5010:80 my-awesome-container-app:1.0.0

然后访问 http://localhost:5010, 就已经可以看到这个测试的 .NET MVC 应用了。

注意,这里需要安装 .NET 7 preview 7 或以上版本,并且本机安装并运行了 Docker。

容器化 .NET 应用是不是变得更加简单方便了。

内置容器化支持

可能你已经有了疑问, 这是什么魔法?我们熟悉的 Dockerfile 去哪了? 基础镜像是怎么定义的?镜像标签是什么?

是的,之前我们更熟悉使用 Dockerfile 的形式构建镜像。而现在,可以在 .NET 项目中,配置 MSBuild 属性来做同样的事情,指定基础镜像,标签等等。

要对 .NET 应用进行容器化,只需要在 project.csproj 中配置属性即可,如下

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>my_awesome_container_app</RootNamespace>
</PropertyGroup> <PropertyGroup>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<PublishProfile>DefaultContainer</PublishProfile>
<ContainerImageName>my-super-awesome-app</ContainerImageName>
</PropertyGroup> <ItemGroup>
<PackageReference Include="Microsoft.NET.Build.Containers" Version="0.1.8" />
</ItemGroup> </Project>

下面是一些常见的自定义参数介绍

基础镜像

<ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:6.0</ContainerBaseImage>

镜像库

默认情况下,会推送到本地的 Docker Daemon,当然也支持推送到远程的镜像库。

<ContainerRegistry>registry.mycorp.com:1234</ContainerRegistry>

镜像标签

标签可以给应用生成不同的版本,默认情况是读取项目的 Version 属性,你也可以指定 ContainerImageTag 属性,如下

<ContainerImageTag>1.2.3-alpha2</ContainerImageTag>

多个标签用分号隔开

<ContainerImageTags>1.2.3-alpha2;latest</ContainerImageTags>

目前来说,项目还是在初期阶段,不过已经看到了 .NET 团队在这方面的努力,对于其他的一些容器化功能,相信会很快在未来的版本中添加。

更多详细的内容,可以参考下面的文档:

https://github.com/dotnet/sdk-container-builds/blob/main/docs/ContainerCustomization.md

总结

上面的容器化功能,主要是由 sdk-container-builds 这个库实现的。工作原理并不复杂,代码也不多,里面使用到了 .NET 7 新的 Tar API 处理文件,并构建了标准的 OCI 镜像文件,然后通过 Docker Registry HTTP APIDocker Registry 进行交互以及上传镜像。

希望本文对您有用 !

Reference

https://github.com/dotnet/sdk-container-builds

https://docs.docker.com/registry/spec/api/

https://devblogs.microsoft.com/dotnet/announcing-builtin-container-support-for-the-dotnet-sdk

.NET 7 SDK 对容器的内置支持的更多相关文章

  1. Spring MVC内置支持的4种内容协商方式【享学Spring MVC】

    每篇一句 十个光头九个富,最后一个会砍树 前言 不知你在使用Spring Boot时是否对这样一个现象"诧异"过:同一个接口(同一个URL)在接口报错情况下,若你用rest访问,它 ...

  2. php 内置支持的标签和属性

    内置支持的标签和属性列表如下: 标签名 作用 包含属性 include 包含外部模板文件(闭合) file import 导入资源文件(闭合 包括js css load别名) file,href,ty ...

  3. 迭代器模式的一种应用场景以及C#对于迭代器的内置支持

    迭代器模式 先放上gof中对于迭代器模式的介绍镇楼 意图 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示. 别名 游标(Cursor). 动机 一个聚合对象, 如列表(li ...

  4. thinkphp中ajax使用实例(thinkphp内置支持ajax)

    thinkphp中ajax使用实例(thinkphp内置支持ajax) 一.总结 1.thinkphp应该是内置支持ajax的,所以请求类型里面才会有是否是ajax // 是否为 Ajax 请求 if ...

  5. 重磅!K8S 1.18版本将内置支持SideCar容器。

    作者:justmine 头条号:大数据与云原生 微信公众号:大数据与云原生 创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处. 为了方便阅读,微信公众号已按分类排版,后续的文 ...

  6. Apache Spark 3.0 将内置支持 GPU 调度

    如今大数据和机器学习已经有了很大的结合,在机器学习里面,因为计算迭代的时间可能会很长,开发人员一般会选择使用 GPU.FPGA 或 TPU 来加速计算.在 Apache Hadoop 3.1 版本里面 ...

  7. Spring Boot 定制与优化内置的Tomcat容器

    1.Spring Boot定制与优化内置Tomcat容器. > 内置的容器有三个分别是Undertow.Jetty.Tomcat,Spring Boot 对这三个容器分别进行了实现,它们上层接口 ...

  8. python__007内置函数

    本文摘自:https://docs.python.org/3/library/functions.html?highlight=built#ascii     内置功能     abs() delat ...

  9. Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结

    1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...

随机推荐

  1. Python if-else的简单表示

    常见写法 a = 1 b = 1 c = 2 if a == b: print("true") elif a == c: print("false") else ...

  2. 解决Invalid bound statement (not found)的异常

    今天在搭建框架的时候,报了一个Invalid bound statement (not found)的异常 经过分析,得出原因: 我的mybatis相关的dao和mapper.xml是通过逆向工程生成 ...

  3. 记一次ms17-010复现过程

    最近碰到业务需要使用msf,以前了解过,后面都忘记了.这次干脆写下来,省的每次去找别人写的. 首先是使用nmap探测端口 nmap -O -sV 192.168.153.130 --script=vu ...

  4. 如何在vscode 背景配置一个动态小女孩

    D:\Microsoft VS Code\resources\app\out\vs\code\electron-browser\workbench <!-- Copyright (C) Micr ...

  5. 关于Vue的几个实用知识点(持续更新中……)

    前言 排名不分先后,按自己习惯来的. 一.provide.inject 高级组件 总述: provide在父组件中定义,inject 在子孙组件中定义. provide:选项应该是一个对象或返回一个对 ...

  6. Python在函数中使用列表作为默认参数

    在学习中遇到的Python的一个坑,那就是使用列表作为默认参数. 我们知道,在Python中,列表(list)是可变对象,所以列表的内容可能会在函数内改变.另一个需要注意的是,使用列表作为函数的默认参 ...

  7. CANN算子:利用迭代器高效实现Tensor数据切割分块处理

    摘要:本文以Diagonal算子为例,介绍并详细讲解如何利用迭代器对n维Tensor进行基于位置坐标的大批量数据读取工作. 本文分享自华为云社区<CANN算子:利用迭代器高效实现Tensor数据 ...

  8. Linux操作系统(7):rpm包管理和yum软件包在线管理

    一.rpm 包的管理 介绍:一种用于互联网下载包的打包及安装工具,它包含在某些 Linux 分发版中.它生成具有.RPM 扩展名的文件.RPM 是 RedHat Package Manager(Red ...

  9. 【跟着大佬学JavaScript】之节流

    前言 js的典型的场景 监听页面的scroll事件 拖拽事件 监听鼠标的 mousemove 事件 ... 这些事件会频繁触发会影响性能,如果使用节流,降低频次,保留了用户体验,又提升了执行速度,节省 ...

  10. Harbor-私有镜像仓库的安装部署

    Harbor 安装条件 官网给出了安装需要的最低硬件和软件的条件:https://goharbor.io/docs/2.0.0/install-config/installation-prereqs/ ...