linux - 为 Docker 容器创建共享包缓存文件夹

标签 linux docker asp.net-core dockerfile

我编写了一个 ASP.NET Core 应用程序,它应该在使用 docker 的容器中运行。这可行,但孔构建过程相对较慢。主要瓶颈似乎是nuget。引用了很多包,从网上全部加载需要时间。这是在每次构建时完成的,因为 docker 总是启动一个新容器。

我的想法是在存储包的主机上创建一个持久字典。因此不必在每次构建时都获取它们。 dotnet restore 有一个参数 --packages 我可以在其中定义缓存目录。但是为此,它需要将共享字典传递给 docker build 命令。

我发现 docker run 有一个 -v 参数,我可以在其中传递/host/path:/container/path 以将文件夹从主机共享到容器。但这仅适用于 docker run,不适用于 docker build。此外,COPY 命令不适合此处,因为它只允许我将文件从主机复制到容器。首先,我必须以相反的方式复制(容器到主机)。

那么如何创建一个不与容器一起处理的缓存目录呢?

我发现类似的问题 this .它的 Composer 在那里,但持久缓存目录的问题是一样的。他们在 docker run 上使用 -v 参数。但我不明白这是如何解决问题的:在我对 docker 的理解中,dockerfile 应该构建应用程序。这包括安装 NuGet-Packages for ASP.NET Core、bower 等依赖项。所以这应该发生在 dockerfile 中,而不是在运行容器时。

最佳答案

如果您绝对必须首先在容器中恢复包,那么您能做的最好的事情就是重新使用已经恢复包的中间或以前构建的 docker 镜像。

如果您使用 Visual Studio 生成的 Dockerfile,它已经尽最大努力重新使用包含包缓存的中间图像。这是通过首先复制 .csproj 文件、恢复包,然后复制源文件来完成的。这样,如果您没有更改您的包引用(基本上是 .csproj 中唯一发生变化的内容),那么 docker 只需使用它在恢复包后在先前构建中创建的中间图像。

您还可以创建一个已恢复包的基础镜像,并偶尔更新它。以下是您的操作方式:
1. 构建您的 Dockerfile:docker build .
2. 标记具有包缓存的中间容器(由 dotnet restore 创建的容器):docker tag {intermediate image id} {your project name}:base-1
3. 更新 Dockerfile 以使用 {your project name}:base-1 作为基础镜像 FROM {your project name}:base-1
4. 如果您使用的是构建系统,则发布基础镜像:docker publish {your project name}:base-1
5. 定期更新您的基础镜像,滚动版本号。

关于linux - 为 Docker 容器创建共享包缓存文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41304596/

相关文章:

android - Bad Request 400 从 Flutter 请求 ASP.Net Core 3.0

c# - ASP.NET 核心身份中通过角色声明进行的 JWT 身份验证

c - 多个线程能够同时获得 flock

Docker 与 nginx 组合不断显示欢迎页面

docker - 如何将docker image作为单例运行

docker - Dockerfile是从Centos:7构建的-是否有一种方法指示npm安装?

python - pandas安装-numpy版本太旧

c - 如何检测我是否是第一个实例或向同一应用程序的前一个实例发送 IPC 消息?

linux - 如何通过互联网访问Kubernetes服务?

c# - 在哪里可以记录 ASP.NET Core 应用程序的启动/停止/错误事件?