在离线情况下使用NuGet缓存在.NET Core的Docker构建中

5
在封锁区的新地区,我现在只能使用高昂的sim卡数据计划,并且正在寻找一种减少带宽的方法。
我的应用程序有一个常规的dockerfile用于构建,但每次都需要在线恢复包。
我使用的是MacOS,构建过程不需要可移植性。
由于我有本地nuget包缓存(~/.nuget/packages),我想利用这个并重新使用这些文件。
首先,我想指出使用IDE从我的发布中并使用该结果对于此项目不可行,我真的需要从源代码构建它。
还有许多关于直接或半相关情况的讨论以及一些博客文章,但似乎没有一个理想的解决方案。我进行了相当广泛的搜索。如果您认为这是一个具有有效解决方案的现有帖子的重复,请仔细查看。
我查看过的内容:
- 我可以将.nuget缓存挂载到卷中并在docker构建过程中使用它吗?答案似乎是否定的,因为docker build没有-v / --volume选项。 - 我可以安装本地nuget服务器吗?我发现的唯一有效的MacOS解决方案是BaGet,但在尝试使其工作时,我注意到有一个开放的票据,在那里说在使用它作为缓存时不会拉取包依赖项,因此这不是一个有效的解决方案。 - 我可以在docker构建的一个层中一次性还原所有软件包。可能是可以的,但很棘手,因为有许多导入的子项目,这意味着在更改时软件包将定期重新导入。
我目前正在考虑以下内容:
- 通过符号链接使.nuget文件夹成为构建文件夹的一部分 - 找到所有要包括的fsproj文件,然后将它们复制到docker构建的一个层中 - 使用符号链接作为软件包来源进行dotnet restore - 进行构建,作为下一层
一个问题是我无法硬编码fsproj的依赖项,并且不能从dockerfile内部找到所有项目文件。一篇博客文章建议进行预处理,在其中找到文件,将其放入存档中,并在dockerfile中展开。
在我开始走一些错综复杂的道路之前,有人尝试过解决这个问题吗?或者提出了一个好的清洁解决方案?
编辑:
docker将不会访问指向构建目录外的符号链接。

你好,你能解决这个问题吗?我也遇到了同样的问题。 - Fakhar Ahmad Rasul
1
没有,但是像建议的那样使用buildkit似乎是正确的答案,因为我认识的其他人也经历了同样的问题。 - Thomas
1个回答

2

如果您还没有这样做的话,我建议您研究一下Docker BuildKit。BuildKit增加了对Dockerfile挂载的支持。它支持各种类型的挂载,其中之一是缓存,旨在用于构建缓存工件,例如NuGet软件包。


2
我完全不知道BuildKit!谢谢,我要去了解一下,看看它是否可行! - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接