当前位置: 首页 > news >正文

在仅有runtime的Docker镜像中使用dotnet global tool的方法

Docker镜像中使用dotnet global tool

△ 背景和问题概述

.NET Core 自2.1版本起便支持了Global tool特性。通过这一特性,用户能够借助命令行轻松实现众多功能,而微软提供的dotnet诊断工具系列也均以global tool形式呈现,使得使用过程更为便捷。然而,global tool的安装通常需要SDK环境,这在仅包含runtime的Docker镜像中并不适用。那么,如何在这样的环境下充分利用global tool呢?接下来,我们将深入探讨这一问题。

△ Global tool特性与运行时环境

dotnet global tool是框架依赖型发布项,其运行依赖于特定的运行时环境。当运行时无法找到时,它将尝试使用更高版本的runtime,并遵循前滚(roll-forward)规则进行选择。这一规则允许应用程序前滚至指定主要版本和次要版本的最新修补程序版本。若主要版本和次要版本均无匹配的运行时,则会选用下一个较高的次要版本。值得注意的是,前滚规则不适用于runtime的预览版,也不适用于预览版与正式版之间的转换。因此,使用预览版创建的.NET global tool需要作者重新生成、发布并安装。

在以下两种常见场景中,roll-forward行为将有所限制:

  1. 当仅有低版本运行时可用时,roll-forward仅会选择之后的版本,而不会选择低版本。

  2. 若仅有更高主要版本的运行时可用,且两者间存在不兼容的API变更风险时,roll-forward默认不会跨越主要版本界限进行选择。

若无法找到合适的runtime版本,全球工具将无法运行并会抛出错误信息。我们可以通过执行dotnet --infodotnet --list-runtimes来查看当前可用的runtime信息。

要安装dotnet global tool,可以使用命令dotnet tool install --global dotnet-dump来安装dotnet-dump这个global tool。但请注意,尽管安装global tool需要SDK环境,但global tool在运行时仅依赖于runtime。这似乎产生了一个矛盾:我们实际上只需要runtime就能运行global tool,但安装时却需要SDK。这一现象在GitHub上引发了讨论。

△ Docker多阶段构建策略

为了解决这一问题,我们可以采取两种策略:一是直接在环境中安装SDK或使用带有SDK的环境;二是先在SDK环境下安装global tool,然后再将其拷贝到仅包含runtime的环境中。

Docker环境中,我们可以利用其多阶段构建功能来在构建镜像时安装dotnet global tool。具体来说,可以在Dockerfile中指定一个包含SDK的镜像作为基础镜像,并在构建过程中安装所需的global tool。最终,在拷贝发布内容时,同时也将global tool拷贝到镜像中。这样,即使在只有runtime的环境中,我们也能够充分利用dotnet global tool的功能。以下是一个示例Dockerfile:

```Dockerfile

FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build-env

WORKDIR /app

在此处添加安装global tool的命令和拷贝操作的指令

install dotnet tool

RUN dotnet tool install --global dotnet-dump

COPY 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 AS runtime

LABEL Maintainer="WeihanLi"

WORKDIR /app

copy dotnet tools from build stage

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只会额外增加几十兆的镜像大小,例如,仅安装一个dotnet-dump工具(具体大小取决于dotnet tool的实际大小)。

通过这种方式,我们能够在Docker容器中充分利用dotnet global tool,而无需担心runtime版本的问题。可以通过执行docker run --rm --name sparktodo sparktodo-api命令,来启动一个名为sparktodo的容器,进入该容器的内部进行工具的测试和使用。

http://www.jsqmd.com/news/418547/

相关文章:

  • JavaScript详解:从入门到高级的全面学习指南
  • 3D模型转AI绘画:Blender+Stable Diffusion工作流
  • 2026年哈尔滨抖音短视频代运营公司5强推荐榜单发布 - 精选优质企业推荐榜
  • 比话降AI和嘎嘎降AI哪个好?花了200元实测对比告诉你 - 我要发一区
  • 辉夜姬续
  • 2026年深圳抖音短视频代运营机构5强推荐榜单发布 - 精选优质企业推荐榜
  • 2026年论文降AI后AI率又弹回去了怎么办?这3个原因你没注意到 - 我要发一区
  • 联邦学习赋能AI原生应用领域的关键策略
  • 2026年杭州抖音短视频代运营服务商5强推荐榜单公布 - 精选优质企业推荐榜
  • 2026年安徽抖音短视频代运营公司推荐榜单5强发布 - 精选优质企业推荐榜
  • DeepSeek总结PostgreSQL中统计信息对查询性能的影响
  • 2026年郑州抖音短视频代运营公司5强推荐榜单发布 - 精选优质企业推荐榜
  • Substack文章《2028全球智能危机》为何能让华尔街集体恐慌?IBM单日暴跌13%,道指狂泻820点。
  • AI时代:汉字结构性优势的觉醒
  • 汉字:AI 时代的文明密码
  • 破壁之战:汉字如何突破 AI 技术字母霸权?
  • LeetCode 1404.将二进制表示减到 1 的步骤数:模拟+高精度模拟玩玩(运算符重载)
  • 程序员自述:一款小众电脑工具,从闲时练手到月入3万,我踩了所有坑
  • 2026年论文降AI越改越高?可能是这3个原因在作怪 - 我要发一区
  • 2026年毕业论文AI率超30%?研究生亲测5款知网降AI工具后只推荐这个 - 我要发一区
  • Cloudflare人机验证与连接安全机制解析
  • 一周AI动态:开源模型与新工具
  • 2026年武汉抖音短视频代运营公司排行榜TOP5发布 - 精选优质企业推荐榜
  • 加密货币与银行巨头动态简报
  • DeepSeek写论文后怎么快速过知网AIGC检测?降AI工具完整操作教程 - 我要发一区
  • 直击装修痛点|成都里林设计:精准解决成都业主装修前所有担心,省心装家不踩坑 - 推荐官
  • 【2025最新】基于SpringBoot+Vue的PS游戏服务网站管理系统源码+MyBatis+MySQL
  • 论文写作效率革命:六种由人工智能驱动的文献引用管理技巧详解
  • SpringBoot+Vue +办公管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 智能化文献管理解决方案:六种AI辅助论文引用技术的实践应用