【问题标题】:Create shared package cache folder for a Docker container为 Docker 容器创建共享包缓存文件夹
【发布时间】:2016-12-23 16:11:11
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: linux docker asp.net-core dockerfile


【解决方案1】:

如果您绝对必须首先在容器中恢复包,那么您能做的最好的事情就是重新使用已经恢复包的中间或以前构建的 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. 定期更新你的基础镜像,滚动版本号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-06
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 2017-12-13
    • 2019-12-26
    相关资源
    最近更新 更多