在构建期间将大文件添加到docker

use*_*014 6 git docker dockerfile git-lfs

我的服务在运行时需要一些大文件(~100MB-500MB)这些文件可能会偶尔发生变化,我不介意重建我的容器并在发生时重新部署它.

我想知道什么是存储它并在构建期间使用它的最佳方式,因此团队中的任何人都可以更新容器并重建它.

到目前为止,我最好的想法是将这些大文件存储在git LFS中,用于每个版本的不同分支.这样我就可以将它添加到我的Dockerfile中:

RUN git clone -b 'version_2.0' --single-branch --depth 1 https://...git.git
Run Code Online (Sandbox Code Playgroud)

这样,如果这些大文件发生变化,我只需要version_2.0 在Dockerfile中更改,然后重建.

还有其他推荐的方法吗?我考虑过将这些文件存储在Dropbox中,并wget在构建期间使用链接获取它们

PS - 这些大文件是某些Deep-Network的权重

编辑 - 问题是在docker中存储大文件的合理方式,这样一个开发人员/团队可以更改文件和匹配代码,并且会记录(git)并且可以轻松地使用,甚至可以由其他团队部署(因此,只是本地PC上的大文件坏了,因为它需要发送给另一个团队)

Von*_*onC 8

这些文件可能会偶尔发生变化,我不介意重建我的容器并在发生时重新部署它.

然后源控件不是最适合这种工件.

二进制工件存储服务,如NexusArtifactory(两者都有免费版本,如果需要,还有自己的docker镜像)更适合这项任务.

从那里,您的Dockerfile可以从Nexus/Artifactory中获取您的大文件.
请参阅此处以获取正确的缓存和缓存失效.


emo*_*ory 5

我觉得我一定是误读了你的问题,因为答案对我来说似乎非常明显,但其他受访者都没有提到它。因此,如果我极大地误解了您的问题,请原谅我。

如果您的服务在运行时需要大文件并且它们不时发生变化,那么

  • 不要将它们包含在图像中;但反而
  • 将它们安装为卷,


小智 4

它实际上取决于您如何构建容器,例如,我们使用 Jenkins 和 Fabric8 io 插件作为 Maven 构建的一部分来构建容器。我们使用 ADD 和远程源 url (Nexus)。

一般来说,您可以使用 URL 作为源。所以这取决于您可以访问哪个存储。1. 您可以创建一个 s3 存储桶并提供对 docker 构建器节点的访问。您可以添加ADD http://example.com/big.tar.xz /usr/src/things/到您的 docker 文件中进行构建

  1. 您可以将大文件上传到工件存储库(例如Nexus或Artifactory)并在ADD中使用它

  2. 如果您使用 Jenkins 进行构建,请在同一主机中创建一个文件夹并配置网络服务器以使用虚拟主机配置来提供该内容。然后使用该网址。

最佳解决方案是在不影响安全性的情况下,在工作量和成本方面更便宜的解决方案。