为Docker容器

时间:2016-12-23 16:11:11

标签: linux docker asp.net-core dockerfile

我编写了一个ASP.NET核心应用程序,它应该使用docker在容器中运行。这是有效的,但是洞建造过程相对较慢。主要瓶颈似乎是努力。引用了很多包,从Internet上加载所有包都需要时间。这是在每次构建时完成的,因为docker alwas启动了一个新容器。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

如果绝对必须首先在容器中还原软件包,那么最好的办法是重新使用已还原软件包的中间或先前构建的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以使用{您的项目名称}:base-1作为基本映像FROM {your project name}:base-1
 4.如果您使用的是构建系统,请发布基本映像:docker publish {your project name}:base-1
 5.定期更新您的基本映像,滚动版本号。