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

问题描述 投票:6回答:7

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

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

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

RUN git clone -b 'version_2.0' --single-branch --depth 1 https://...git.git

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

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

P.S - 这些大文件是某些Deep-Network的权重

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

git docker dockerfile git-lfs
7个回答
2
投票

它实际上归结为你如何构建容器,例如我们使用Jenkins和fabric8 io插件构建我们的容器作为maven构建的一部分。我们将ADD与远程源URL(Nexus)一起使用。

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

  1. 您可以将大文件上传到工件库(例如Nexus或Artifactory)并在ADD中使用它
  2. 如果您使用Jenkins构建,则在同一主机中创建一个文件夹并配置Web服务器以使用virtualhost配置提供该内容。然后使用该Url。

最佳解决方案是在努力和成本方面更便宜而不影响安全性。


8
投票

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

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

二进制工件存储服务,如NexusArtifactory(两者都有自由版本,并且如果需要的话,它们都有自己的docker镜像)更适合这项任务。

从那里,您的Dockerfile可以从Nexus / Artifactory中获取您的大文件。 在这里查看proper caching and cache invalidation


4
投票

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

如果您的服务在运行时需要大文件,并且它们会不时更改,那么

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

1
投票

卷作为单独的节点存在并在团队之间共享

只是为了补充@emory's answer,我建议你使用Kubernetes' Persistent Volumes为你的确切情况。

那些人会有什么帮助?

正如你所说,有多个团队,每个团队可能运行一个POD,简单来说就是一组容器和他们交互的规范(如启动,传递数据等)。换句话说,它是多个容器之间的逻辑连接。此类POD通常在群集上运行,并由Kubernetes的引擎管理。

持久卷是包含数据的群集中的另一个资源。与常规卷相比,它们在群集中重新发送,并且可以通过指定PersistentVolumeClaims由不同的POD访问。

使用这种方法,您可以:

  • 没有容器的停机时间(根据需要在集群中复制POD)
  • 更新团队中任何人(或团队的子集)的网络权重
  • 从POD获取权重更新,而不会干扰容器

IMO这种方法比每次更改数据时仅重建容器更具可持续性。


0
投票

如果您有私有docker注册表,则可以使用已包含的文件构建基本映像。然后在您的服务的Dockerfile中有FROM指令指向该基本映像。

然后,当其他团队成员想要更新时,他们只需更新Dockerfile上的FROM指令。

使用此方法与保留原始文件的位置无关,因为在构建基本映像时它们仅使用一次。


0
投票

如果确保使这些文件成为构建映像的最后一步(或最后一步),则构建可以使用先前版本的缓存。唯一要重建的是包含大文件的层(以及之后的任何步骤)。

下载新图像也将只下载最后一层。

至于重新部署,您需要确保所有数据(configs,tmp,...)都存储在卷中。然后“重新部署”可以使用docker run ... --volumes-from=old-container ...并立即再次使用。


0
投票

如果您正在考虑使用Dropbox,为什么不考虑AWS S3?或者您可以将它们安装在某个卷或文件系统中。

© www.soinside.com 2019 - 2024. All rights reserved.