在 dotnet runtime 的容器中安装 dotnet global tool

在 dotnet runtime 的容器中安装 dotnet global tool

Intro

.NET Core 从 2.1 开始支持 Global tool, 借助 global tool 我们可以通过命令行来实现很多功能,微软提供的一系列的 dotnet 诊断工具也都提供了 global tool,我们可以通过 global tool 比较方便的进行使用,

但是 global tool 默认是只能装了 SDK 之后才能装,在实际的生产环境我们一般都是使用只包含 runtime 的 docker 镜像,没有 SDK 就不能直接安装 global tool,那我们要怎么做才能在只有 runtime 的 docker 镜像中使用 global tool 呢?且看下面的介绍

Global tool

dotnet global tool 是框架依赖发布的,所以是需要依赖运行时的,如果 dotnet tool 依赖的运行时找不到的时候,会尝试使用高版本的 runtime,遵循前滚(roll-forward)规则

  • 应用程序前滚至指定的主要版本和次要版本的最高修补程序版本。

  • 如果主要版本号和次要版本号没有匹配的运行时,则使用下一个较高的次要版本。

  • 前滚不会发生在 runtime 的预览版本,也不会发生在预览版和正式版之间。因此,使用预览版创建的 .NET  global tool 必须由作者重新生成和重新发布,再重新安装。

在下面两种常见的场景下默认不会发生 roll-forward :

  • 只有低版本运行时可用时,roll-forward 只会选择之后的版本,低版本不会被选择

  • 只有更高的主要版本运行时可用时,roll-forward 默认不会跨越主要版本的边界,主要版本发生变化有些 API 可能会有不兼容的变更

如果找不到一个合适的 runtime 版本,会运行失败并抛出错误信息。

我们可以通过 dotnet --info 或者 dotnet --list-runtimes 来查看已有的 runtime 信息

Install dotnet global tool

通过 dotnet tool install --global dotnet-dump 我们就可以安装 dotnet-dump 这个 global tool 了,但是就像前面提到的,我们必须要安装 SDK 才能安装 global tool,但是其实 global tool 运行的时候只依赖于 runtime,这就有点“悖论”了,明明我只需要 Runtime 就可以运行的,但是要安装 SDK 才能安装,在 Github 上提了一个 issue,有需要的可以关注一下:https://github.com/dotnet/sdk/issues/18168

在网上 Google 之后就会发现有一些解决方案,大体上分为两类,一种是直接安装 SDK 或使用 SDK 的环境,第二种则是在 SDK 的环境下安装 global tool,装好之后把 global tool 拷贝到只有 runtime 的环境中

Docker practice

在 docker 环境中,我们可以结合默认的多阶段构建的方案,在 build 镜像中安装 dotnet global tool,在最后拷贝发布内容的时候同时也拷贝 dotnet global tool

Dockerfile 示例如下:

FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build-env
WORKDIR /app# install dotnet tool
RUN dotnet tool install --global dotnet-dumpCOPY SparkTodo.Shared/SparkTodo.Shared.csproj SparkTodo.Shared/
COPY SparkTodo.API/SparkTodo.API.csproj SparkTodo.API/
RUN dotnet restore SparkTodo.API/SparkTodo.API.csproj# copy everything and build
COPY . .WORKDIR /app/SparkTodo.API
RUN dotnet publish -c Release -o out# build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:5.0-alpine
LABEL Maintainer="WeihanLi"
WORKDIR /app
COPY --from=build-env /app/SparkTodo.API/out .
COPY --from=build-env /root/.dotnet/tools /root/.dotnet/tools
ENV PATH="/root/.dotnet/tools:${PATH}"
EXPOSE 80
ENTRYPOINT ["dotnet", "SparkTodo.API.dll"]

通过多阶段构建的方式,我们可以避免直接使用特别大的 SDK 镜像,通过这种方式安装 dotnet tool 镜像只会增加几十M的大小(我装了一个 dotnet-dump,具体还是要看 dotnet tool 的大小)

通过 docker run --rm --name sparktodo sparktodo-api 运行一个容器,然后通过 docker exec -it sparktodo sh 进入到容器内部,然后就可以测试我们安装的 dotnet global tool 了

可以看到我们安装的 dotnet global tool 已经可以正常使用了

More

我们在 Dockerfile 里安装了 dotnet global tool 并使用了默认的 dotnet tool 的路径,并配置了环境变量以便于可以直接使用 dotnet global tool,如果需要也可以配置 dotnet tool 的安装路径,通过 dotnet tool install --global dotnet-dump --tool-path /usr/bin 来指定自定义的路径

References

  • https://docs.microsoft.com/en-us/dotnet/core/tools/global-tools

  • https://docs.microsoft.com/en-us/dotnet/core/tools/troubleshoot-usage-issues

  • https://docs.microsoft.com/en-us/dotnet/core/deploying/#publish-framework-dependent

  • https://andrewlock.net/running-net-core-global-tools-in-non-sdk-docker-images/

  • https://github.com/dotnet/sdk/issues/18168

  • https://github.com/WeihanLi/SparkTodo/blob/master/Dockerfile

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

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

相关文章

Asymptote 学习记录(2):例子阅读

学习编程的一个有效方式是去读别人写的代码.我学习了这里的代码.代码虽多,但是简单.代码如下(稍微做了修改): import settings; pdfviewer"/usr/bin/okular"; outformat"pdf"; size(400); texpreamble("\usepackage{CJK}\AtBeginDocument{\begin{CJK}…

如何启发孩子的数学思维?你想要的答案或许在这!

▲数据汪特别推荐点击上图进入玩酷屋记得寒假时,超模君七岁小表弟来问了我一道题目:下面线段有多少条?首先我问了他什么是线段?他说:两端有端点,不可以伸长的直线。AB就是线段。我慢慢引导,假如…

.NET Core 服务在 ARM64 服务器中的部署

Linux 服务器 CPU 架构主要可分为:X86_64/AMD64、ARM64/AARCH64 两大类,大多情况使用的都是基于 AMD64 CPU 架构的服务器。但随着国产操作系统、CPU 等自主生态打造的应用产品得到越来越多的用户认可和应用,如:华为鲲鹏、统信 UOS…

php 读取onedrive文件夹,oneindex

oneindexOnedrive Directory Index功能:不用服务器空间,不走服务器流量,直接列onedrive目录,文件直链下载。demochange log:18-03-29: 更新直链获取机制、缓存机制,避免频繁访问的token失效18-03-29: 解决非英文编码问…

50种奇妙装置玩法,将STEM教育一网打尽

▲数据汪特别推荐点击上图进入玩酷屋致砖《小小机器人》套装全新首发电动机械的完美结合先来看看视频过过眼瘾吧来自美国STEAM教育让孩子跨学科学知识积木向来是STEAM教育很重要的一部分,因为它涉及到了多种学科:要搭建得稳固——这是工程学;…

ubuntu php7.4,在Ubuntu 18.04/19.04/16.04版本上安装PHP 7.4的简单方法

以下介绍安装PHP 7.4的方法非常的简单,适用于Ubuntu 18.04/19.04/16.04版本上,所安装的版本是PHP 7.4.0 RC1,只需要添加PHP ppa存储库并运行相关命令即可完成安装。一、添加PHP ppa存储库我们将添加ppa:ondrej/php PPA存储库,它具…

通过Dapr实现一个简单的基于.net的微服务电商系统(十七)——服务保护之动态配置与热重载...

在上一篇文章里,我们通过注入sentinel component到apigateway实现了对下游服务的保护,不过受限于目前变更component需要人工的重新注入配置以及重启应用更新component等等原因,对于真实的环境运维稍有难度,最近我根据sentinel-gol…

NASA成立寻找外星人小组,三全水饺回应猪瘟,微波炉+葡萄=爆炸,94年故宫首次晚间开放,这就是今天的大新闻!...

元宵节刚刚过完汤圆也吃了好几碗是时候来回忆下发生了什么下面是今天的大新闻报!故宫网站崩了,被众多人“围攻”! (搜狐新闻)此前,故宫94年来首开夜场”的消息刷屏了!故宫将在正月十五、十六开夜…

wpf 可以取消的单选checkbox

利用radioButton的groupName分组互斥。。再解决radiobutton的取消选择的问题。给radiobutton加了一个像checkbox的样式 2个方式&#xff1a; 效果图 第一种usecontrol&#xff1a; xaml&#xff1a; View Code <RadioButton x:Class"GEMS.Windows.Controls.UserContro…

表格高亮

引用&#xff1a;http://blog.163.com/ms8712126/blog/static/1899099120122934023200/ //js实现隔行变色window.οnlοadfunction(){var otaldocument.getElementById("otable");for(var i0; i<otal.rows.length; i){ if(i%20){ otal.rows[i].className"e…

大数据人工智能时代,这个行业终于爆发了!

全世界只有3.14 % 的人关注了数据与算法之美这个冬天的程序员可谓是受到了心理和生理上的双重折磨&#xff0c;不仅天气冷&#xff0c;寒冬还见了鬼一样的笼罩着互联网&#xff01;正如老话所说&#xff0c;哪有稳定的工作&#xff0c;只有稳定的能力。这个冬天上午还在改bug下…

弃码而去

题图来自溪源2017年拍摄的照片。弃码而去1那是2015年的一天。下午5点40&#xff0c;我收拾完手头上的工作&#xff0c;准备关机回家时&#xff0c;qq上突然弹出的窗口吸引了我的注意。“源哥&#xff0c;我能跟你聊一下么&#xff1f;”我点开一看&#xff0c;发现给我发消息的…

config.php开启redis,微擎如何开启redis,redis开启方法详解

资源来源网络&#xff0c;如果需要授权&#xff0c;请大家更换源码&#xff0c;模块仅供学习&#xff0c;如需商用请购买正版授权&#xff0c;本栏目不提供技术服务&#xff0c;积分不够请签到&#xff0c;或者会员中心投稿源码一、使用5G云宝塔定制版的很多问微信怎么开启redi…

对不起,你被裁了

全世界只有3.14 % 的人关注了数据与算法之美在这互联网高速发展的时代新词层出不穷不过说到造词能力中国肯定是当仁不让的就连裁员这件事都能玩出花来今天数据汪就给大家普普及一下那些关于“裁员”的黑话美团美团外卖&#xff0c;裁员真快不久前&#xff0c;有美团员工在脉脉上…

c#爬虫-使用ChromeDriver 所见即所得

问题最近在做爬虫的时候发现很多网页都是浏览器看得见&#xff0c;但是源文件是看不到的&#xff0c;也就是所谓的异步加载。这时候如果我们需要那些异步内容&#xff0c;要么是了解他的规则&#xff0c;进行条件的组合进而再次进行http请求&#xff0c;得到数据&#xff1b;这…

使用Ext.grid.Panel显示远程数据

使用Ext.grid.Panel显示远程数据 对于Ext.grid.Panel而言&#xff0c;它只是负责显示Store数组中心的数据&#xff0c;至于Store保存的数据到底是浏览器本地数据&#xff0c;还是远程服务器的数据&#xff0c;Ext.grid.Panel并不关心。因此&#xff0c;使用Ext.grid.Panel显示远…

4-8岁那些最难的数学概念,美国老师用一套绘本让孩子秒懂

▲数据汪特别推荐点击上图进入玩酷屋在美国&#xff0c;有不少数学故事类的绘本&#xff0c;小木今天推荐的这套《Math is categorical》就经常被美国老师用于课堂的教学&#xff0c;亚马逊的评价也是接近5星的好评。下面这个5星评价就是来自于一位美国老师&#xff0c;她就说学…

WPF 读取Docx文件并显示(附下载链接)

在wpf中直接显示Docx文件 &#xff0c;直接看看效果吧&#xff1a;下面直接看代码&#xff0c;添加主要有两个类&#xff1a;DocxReader类&#xff1a;using System; using System.IO; using System.IO.Packaging; using System.Xml;namespace WpfEmbeddedDocx {class DocxRead…

李国庆离开当当,广东消委会告长隆,智能校服提供定位功能,全球首个5G火车站来了,这就是今天的大新闻...

今天是2月21日农历正月十七今天下雨 出门忘带雨伞但是心情还是美丽的因为我没被淋湿下面是今天的大新闻李国庆宣布离开一手创办的当当 &#xff08;界面新闻&#xff09;2月20日上午&#xff0c;当当联合创始人李国庆正式宣布&#xff0c;将离开自己一手创办并为之奋斗19年的…

Source Generators(源代码生成器)的调试器支持 | Visual Studio 2019(16.10)新功能试用...

开始之前Source Generators旨在启用编译时间元编程&#xff0c;即可以在编译时间创建并添加到编译中的代码。首先用一个Demo为不了解Source Generators的朋友演示一下功能。Source Generators详细说明请参看Source Generators Cookbook[1]创建一个ClassLibrary1项目&#xff08…