我编写了一个 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/