在 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

在 dotnet runtime 的容器中安装 dotnet global tool相关推荐

  1. Docker(三):镜像导入与导出、保存与加载、在Docker容器中安装软件

    相关阅读: Docker(一):Docker的安装与常用命令 Docker(二):Docker常用命令之镜像的创建:Dockerfile 与 commit Docker(三):Docker镜像导入与导 ...

  2. docker容器中安装vim

    docker容器中安装vim 在使用docker容器时,容器一般没有安装vim,就需要安装vim apt-get install vim命令用于安装vim,但是下载过慢. 第一步 配置国内镜像源 进入 ...

  3. linux dotnet run失败,dotnet build使用dotnet在docker容器中失败:2.1-...

    我正在尝试将docker支持添加到现有的ASP.NET Core 2.1 Web应用程序中.在dotnet build命令期间失败,说它无法加载共享库kernel32.dll和libkernel32. ...

  4. 容器安装java_在docker容器中安装Java(从宿主机向docker容器中拷贝文件)

    操作系统 [root@Optimus /]# uname -a Linux Optimus 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2 ...

  5. 解决:bash: vim: command not found、docker 容器不识别 vi / vim 、docker 容器中安装 vim

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 在 Docker 容器中编辑文件,报错如下: bash: vim: command not f ...

  6. docker容器中安装vim 、telnet、ifconfig, ping命令

    在使用docker容器时,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found,这个时候就需要安装vim,可是当你敲apt-get install vim命令时 ...

  7. 在docker容器中安装ifconfig、ping等工具

    为PaddlePaddle容器安装基础工具 PaddlePaddle容器缺少很多OS工具,因此与外部进行交互时不是很方便,对于在使用中新安装的工具包做个记录,再次使用类似容器时可以快速进行安装. 安装 ...

  8. Ubuntu在docker容器中安装TensorFlow-1.5

    本文部分参考https://blog.csdn.net/u013948858/article/details/78429954 注意以下操作在64位Ubuntu16.04或14.04下进行,不支持32 ...

  9. 【全】在 Docker 的Solr容器中安装 IK 中文分词器

    [原创文章,转载请标明出处] 这些坑我已经帮你踩过了: 现在大家能够在网上(需要禾斗学上网)下载的IK分词器版本已经非常老了,而Solr更新还是非常快的,所以会出现版本不兼容的问题,不然即使成功装上了 ...

最新文章

  1. 探索可解释及稳定性,AI与博弈,自适应推理——“智源论坛:机器学习青年学者报告会”要点总结
  2. C# 遍历窗体控件顺序问题
  3. firefox+android+平板,Firefox OS首款平板现身,“三头并进”追赶Android
  4. 光伏领跑者火热前行 可靠性护航“长跑”
  5. Nginx的UDP健康检查
  6. python高级-------python2.7教程学习【廖雪峰版】(四)
  7. imregionalmax
  8. [导入]用Windows自带的媒体播放器抓视频截图
  9. centos8.0配置静态IP详解
  10. VS2017+DirectX9环境配置
  11. PID算法优化之积分器抗饱和处理
  12. Unity Spine动画如何选定帧数(时间)播放
  13. PHP字符串函数stripslashes(反引用一个addslashes转义的字符串)
  14. 声速的测量数据处理代码
  15. vue,videojs实现hls直播(萤石视频回放)
  16. java 微信 图灵机器人,SAE服务下用java实现微信公众账号图灵机器人
  17. 计算机网络-15 网络测量
  18. 团队管理中提高团队凝聚力方法
  19. php trader bbands,PHP - Manual: Trader 函数 (官方文档)
  20. htlm5实习报告_网页 实习报告

热门文章

  1. 硬盘分区与故障排解速查手册(1)
  2. [Unity优化]批处理03:静态批处理
  3. python数据类型之元组类型
  4. android-api28转换到api19-不能编译
  5. 单一职责原则--设计模式系列
  6. pullToRefresh下拉刷新上拉加载
  7. 使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器
  8. ACPI知识学习笔记
  9. 使用Azure轻松实现Teams App的全球合规性
  10. android 设备占用_如何查看正在占用Android设备的空间